查看完整版本: 编程的问题请教各位高手! 谢谢!

leo1017 2008-7-16 10:29

编程的问题请教各位高手! 谢谢!

大家好, 最近实习的时侯碰到一个问题. 老板让我编个程序, 但是我对编程实在知之甚少, 为了解决问题只有到这里来提问了. 也不知道这种问题应该到哪问, 战法上有没有供学习交流的板块, 如果发的不对, 版主请见谅!f0ik2d)o8rX

"|0N.p-W3b3ih{K 基本情况是这样的, 我们有很多X光衍射分析得出的数据文件, 但是每个文件里面都有两个数字有问题. 由于数据量比较大, 每次手动来改很麻烦, 所以需要一个程序, 能够自动把这两个错误改过来, 然后换个文件名另存一下.  6V8m0i)c#{:P

9Fad!~ { n0l0V(zB u 文件的格式是.xrdml, 用记事本打开, 一大堆数据. 其中在固定位置会有一段代码是:
N/d5?1pE{ ......CZ+X&A)b@tX
<scanAxisCenter>
m&jA6~\3c7T                 <position axis="2Theta" unit="deg">34.5442</position>
P,B%_8q$o4H                 <position axis="Omega" unit="deg">17.3261</position>$Q"e(m O1X ~r7N:\
            </scanAxisCenter>oH6r*F#I G9D"YyU
            <dataPoints>
,p7Q*W3\6fX eT'ztm                 <positions axis="2Theta" unit="deg">'kbQ G\O/jL
                    <startPosition>[color=Red][b]26.5462[/b][/color]</startPosition>
_ ~,W)d0c                     <endPosition>[color=Red][b]42.5422[/b][/color]</endPosition>FwT4ozO
                </positions>]!WB.f]sI
                <positions axis="Omega" unit="deg"> XUxPrpf
                    <startPosition>13.32710</startPosition>
'~wvfB9a,T                     <endPosition>21.32510</endPosition>S%M j f;K2W^
                </positions>
E9E|*mw                 ......
s Z|i P J| t({`4A~5D
红色那两个数据是错的, 应该都除以二.
3nn[#`)t'rc 所以要求的程序应该能够找出这两个数据, 分别除二, 然后在同个文件夹下另存为一个新文件,  如果源文件名为AAA.xrdml, 那么新文件名为1/2_AAA.xrdml. a!lMY9_/P
当然最后一步是做成一个exe文件,有一个interface,上面有"个Browse",来选文件, 然后有个"确定"什么的. h8c&R9H Q'v%] } B
我对程序设计的认识还停留在C和Java的一点基础的知识,实在是不知道从哪下手. "P2E j4`~R%I3C9Aso
我当然不可能奢望有人能帮我编出这个程序,这毕竟是我的工作, 只是希望有好心的高人能够指点, 我需要学习那些相关的知识点才能完成这些任务?tu/j*?:v$I~Ps
1> 如何在一段程序里找出这两个数据并修改?4P4De6r-Q,|/}&~ay$@
2> 如何改名并保存?
q:vF5s!C!@,N H 3> 用户界面是用什么实现的? s%wmv\"k~ a
知道战法有很多热心的程序高手, 如果能给我提供一些线索, 我将会非常感谢!

snoopy 2008-7-16 11:50

非常简单,如果楼主熟悉java,直接用xml的库函数解析然后做运算。可以使用c#,更简单。
` NQh5wv 这是xml文件的格式。
$@!~4B`5r6r.Q 如果想使用用户界面,直接用c#做最简单。-v%W!R%z@g&~
我可以帮你做,不过最近比较忙,楼主自己研究下,1个小时差不多就能搞定

sohulee 2008-7-16 11:53

dom xpath

zhanghang_1986 2008-7-16 12:00

学过一点儿java和xml的东西,我在网上找到了个小的tutoriel,对你应该有些帮助。[url]http://cynober.developpez.com/tutoriel/java/xml/jdom/[/url]

麦太太 2008-7-16 12:09

哇塞Y0X7[ L#e*zvwg
牛人好多啊
n+VI(pf 羡慕

leo1017 2008-7-16 13:11

非常感谢各位. 多谢snoopy和 zhanghang_1986提供的信息!q~p"D&D7E
另外snoopy兄也太抬举我了. 1个小时, 呵呵, 我三天能把它整出来已经是烧高香了! 因为实在是对xml和C#没有概念啊. 惭愧惭愧.

princehahaha 2008-7-16 14:58

用java自带的parser(最好用dom,适合你这样的修改)把这个xml文件parse一下,parser会针对不同的tag生成相对应的object,你修改这些object就行了.最后用java的serilization把改好的object(记住dom会生成一个树,存的时候一定要从树根存)存成xml就行了(用java.beans.XMLEncoder)。想写图形界面可以用netbeans自己画一个,简单的很。

romeshenchen 2008-7-20 12:58

不难啊 可以看看阿

梅克林格 2008-7-20 13:25

楼上几位都有些不顾实际情况。以我过去的经验,JAVA的XML库文件的配置就有可能把楼主烦死,也有可能根本就搞不定。再说XML编程至少也要懂得XML的格式分析,要学会使用XML文件操作,虽然不是很难,也需要学习时间。
-qi1@lY Ui
F4_JM(g+Ta;?9Yz.m 如果
[0c#O"[ f|;G <positions axis="2Theta" unit="deg">
d\-il/u8iU*p                     <startPosition>26.5462</startPosition>WH'o$kX
                    <endPosition>42.5422</endPosition>&rCo4[)s7e{C3qv2wO
这个2Theta如果具有唯一特性的话,就根据这个特性,直接写个文本操作读出26.5462,转换,再写回去,虽然也有些繁琐,但是不需要了解任何知识,只要懂得文本读写操作就可以搞定。

leo1017 2008-7-21 16:44

:cry: xml看了不少,怎么做这个东西没搞明白!楼上的大哥/大姐,我的想法其实和你一样, 可是不知道怎么写这个代码. 有没人能继续指点一下? }s];Rd4d2pe
如何找到<datapoint>标识下第二行和第三行的数字, 取出除以二, 然后再放入?
L.zu,{w1b 这个C代码怎么写?

zhanghang_1986 2008-7-21 17:02

我刚刚大概看了一下上次我给你的那个tutoriel,用java做。方法如下面这个例子
+}Eo6St0xfCG/s [size=4]Filtrer les éléments[/size]e&h y4@*O
[color=Red] Notre nouvel objectif est d'afficher la classe des étudiants dont le prénom est Laurent et le nom est CynO.Les seuls filtres que nous ayons fait pour le moment étaient directement implementés dans les méthodes que nous utilisions.[color=Black]List listEtudiants = racine.getChildren("etudiant")[/color] nous a permis de filtrer les sous éléments de racine selon leur nom.Vous aurez remarqué que de toute façon nous n'avions que des etudiants, le problème ne se posait donc pas ;)Les filtres permettent des sélections d'éléments selon plusieurs critères. Z&^-wZ6h'b1d1S/by P

Xy;nK8_ 就跟[/color]梅克林格说的一样,如果2Theta是唯一的,那么用一个methode提出那两个数据然后计算就行了。"dy U:R4gR6I
[color=Red]"MU T%c!f;{:}
[/color]

zhanghang_1986 2008-7-21 17:05

欢迎大家批评纠正,jdom我也没真正用过~:redface:

leo1017 2008-7-23 08:26

我求了一个程序, 大概是找到<datapoint>, 然后提出数据操作. 可是编译不出来...
Yeb^*OC 各位高手能不能指点一下?
-ZD'~J]K import java.io.*;
T:l'J;t:~
^S%? z*r public class ReadTest {
)U0K;^@:ct V cWZ)w public static void main(String[] args) throws Exception {
9P`%|,Z1YL)V2] File f=new File("d:\\xxx.xrdml");
?p |)~jE+f0k BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(f)));
-I1GChK9L(M BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f.getParent()+f.getName().replace(".","_2."))));(?g ~ O${"Y\kB-k,Q
String tmp=new String();
M#M~Bm)Y| |gw while((tmp=br.readLine())!=null){1bTG(aX2\ uU6G#c
if(tmp.contains("<startPosition>") || tmp.contains("</startPosition>")){ C{3l Z6M-@&r
double num=Double.parseDouble(tmp.substring(tmp.indexOf("<startPosition>")+"<startPosition>".length(),tmp.indexOf("</startPosition>")));
O x$bp3XDE)Z num=num/2;;b6S@+a A l q
tmp=tmp.substring(0,tmp.indexOf("<startPosition>")+"<startPosition>".length())+num+tmp.substring(tmp.indexOf("</startPosition>"));
 Y%u:f4W,?o1?p }
}@%j _;~/D$g4X bw.write(tmp);"Z*sJ ]|[
bw.newLine(); Ki4gT4?I
}
i ^SMbyOa;yZ)G br.close();9Bp.v{*h/Wr*A
bw.close();-_*a gQ?'OP9C
}
LKfZ$Yj{!` ] 0~dU#[%m(F9} L/x#jG}1X&D
出错信息:
QSB7iS ^ C:\java files>javac readtest.java
l;c,|BA2l%|"H readtest.java:7: replace(char,char) in java.lang.String cannot be applied to (ja
o3v:`nw va.lang.String,java.lang.String),EQ!H9j rx
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream p_2s0qu{I
(f.getParent()+f.getName().replace(".","_2."))));'T2P} af

+U5@x nG.k                         ^
R4l_%H)K#[/jq readtest.java:10: cannot resolve symbol,wF t/U)n
symbol  : method contains (java.lang.String)
I vB9c/i8[9xD} location: class java.lang.String
J)tE|5T)I if(tmp.contains("<startPosition>") || tmp.contains("</startPosition>")){BxF7F$nu@H
      ^
M-^,rySe1q"x [p readtest.java:10: cannot resolve symbol2c2f9} f}3RA1]
symbol  : method contains (java.lang.String)d;oy.O!Y}/J&V
location: class java.lang.String {9\7p6LA8{-[
if(tmp.contains("<startPosition>") || tmp.contains("</startPosition>")){bKf$]gblx-~
                                         ^
)vuiS ]0|5xc7V\ 3 errors

princehahaha 2008-7-23 09:26

1.想替换String的话不能用replace,那是用来替换单个字符的,要用replaceAll,replaceAll需要一个regular expression作为第一个参数.改名的话不用这么麻烦,创建一个新的File对象,然后用f.renameTo(新File)就行了。
l9UjIfO6F L 2.String的contains method只能用来找单个字符,找另外一个String的话可以用indexOf,如果返回值小于0那就说明原字符串里没有你要找的东西,大于等于0的话就说明找到了

zhanghang_1986 2008-7-23 09:32

LZ的算法似乎也有问题.

leo1017 2008-7-23 13:36

回复 14F 的帖子

princehahaha你实在是太好太强大了!!!!,l8W5Z4zNp ~
在你的帮助下, 我终于把这个东西整出来了!
{-FXSW%T8_c _ 眼泪汪汪的. :cry:
ZQ j0@+Bk)w 从xml到matlab到java, 这个东西我足足整了一个星期! ]u uQn/v
zhanghang_1986也谢谢你, 我的算法确实有问题, 不过我还是改过来了!

leo1017 2008-7-23 13:40

搞定搞定了.不过还有java GUI要看.
!L`X)^(V\] GrQ/xXoM9F
[align=right][[i] 本帖最后由 leo1017 于 2008-7-23 15:10 编辑 [/i]][/align]

zhanghang_1986 2008-7-23 14:09

就像princehahaha说的,用file.renameTo(File dest);_3SGg,E'lp

WVX a4@#jVh(Y public boolean renameTo(File dest)
?u/pq&t\
{U(czd7E Zbk M     重新命名此抽象路径名表示的文件。bT'Li^3p)k6PN+UG
!pB ep!g ^ tlS9r[o
    此方法行为的许多方面都是与平台有关的:重命名操作无法将一个文件从一个文件系统移动到另一个文件系统,该操作不是不可分的,如果已经存在具有目标抽象路径名的文件,那么该操作可能无法获得成功。应该始终检查返回值,以确保重命名操作成功。
8VQ m!o/E i-ql)Yx :eY4Z+H0_;ppO3S
    参数:'viDT"F4NB7z3l+o5Th
        dest - 指定文件的新抽象路径名
HpVL!Q i+FR#Gn4^     返回:
0gr GRMd         当且仅当重命名成功时,返回 true;否则返回 false
页: [1]
查看完整版本: 编程的问题请教各位高手! 谢谢!
广告招租
马上开通个人空间,记录我们的留学生活
法语助手在线词典