Topic: Mr. jiangns3000,可否进来看一下。

  Print this page

1.Mr. jiangns3000,可否进来看一下。 Copy to clipboard
Posted by: dingsc
Posted on: 2003-03-30 14:12

前面二进制文件的读取,感谢你的帮助。我会争取进一步去发展。因为我要读取的不光是以N410~N418开头的1000个数据,而且还有以N110~N118,。。。。。N580~N581开头的数据,分别对应一个文件。
只用一个程序来读取各个文件,判断以N***开头,再行处理,有何好的想法?望不吝赐教!

2.Re:Mr. jiangns3000,可否进来看一下。 [Re: dingsc] Copy to clipboard
Posted by: jiangns3000
Posted on: 2003-03-30 15:38

很容易呀,若不用GUI方式的话,将每一个文件名用命令行参数转入即可。
我不大清楚的是,N***的规则是什么?是不是:N110~N118;N210~N218;N310~N318;...;N910~N918 这样?知道这个,程序简单修改一下即可。请告之
N***的详细规则,否则又会理解有误差。等你的回音。

3.Re:Mr. jiangns3000,可否进来看一下。 [Re: dingsc] Copy to clipboard
Posted by: dingsc
Posted on: 2003-03-30 16:16

N***的详细规则:
是这样的:我的二进制文件如果是N110开头,则该文件包含有N110~N118等各1000数据,若以N160开头,则包含N160~N168等各1000数据,若以N210开头,则包含N210~N218等各1000数据,若以N260开头,则包含N260~N268等各1000数据,。。。。。。。。依此类推。
期待大虾回复!^_^
dingsc@etang.com

4.Re:Mr. jiangns3000,可否进来看一下。 [Re: dingsc] Copy to clipboard
Posted by: jiangns3000
Posted on: 2003-03-30 16:36

1000个数据中肯定不会出现N***?我的意思是:开头的第一个N***由数据文件的前四个ASCII决定,以后的N***在前一个基础上加1,其有9个N***?以上理解若正确,则程序很快即能完成。

5.Re:Mr. jiangns3000,可否进来看一下。 [Re: dingsc] Copy to clipboard
Posted by: jiangns3000
Posted on: 2003-03-30 17:11

程序已设计好。并且用原来的数据文件测试,得到相同的结果。Nxxx由数据文件的前四个ASCII决定。
程序用法:java Trans 数据文件名 结果文件名
如:java Trans d:\01152358.414 d:\test.txt
结果文件是一个纯文本文件。(另:我猜:数据值应全为正数。若有负数,是因为JAVA中short是2补表示,可将负数加上65536成为等价正数。但程序中没有这样处理,因为怕对你的问题理解不正确)
程序如下:

import java.io.*;

public class Trans {
static private int Nxxx;
static boolean isFlag(int val)
{int i=Nxxx;
int j;
for(j=0;j<=8;j++)//Nxxx其9个
if(val==i+j) return true;
return false;
}
static short transval(short val)
{ int left,right;
right=val & 0x00ff;
left=val & 0xff00;
return (short) ( (right<<8) |( left>>>8) );
}

public static void main(String[] args)
{
if(args.length !=2)
{ System.out.println("用法:Trans 数据文件名 结果文件名<回车> ") ;
System.exit(1) ;
}
try{
PrintWriter pw = new PrintWriter(new FileWriter(args[1]),true);
DataInputStream ds = new DataInputStream(
new FileInputStream(args[0]));
int left,right,flag;
//读Nxxx
Nxxx=flag=ds.readInt() ;
//处理第一个Nxxx
pw.println();
pw.print((char) ((flag&0xff000000)>>>24 ));
pw.print((char) ((flag&0x00ff0000)>>>16 ));
pw.print((char) ((flag&0x0000ff00)>>>8 ));
pw.print((char) (flag&0x000000ff) );
pw.print(' ') ;
//处理其它的数据及Nxxx
while (ds.available() >0) {
flag=ds.readInt() ;
if( isFlag(flag))
{ pw.println();
pw.print((char) ((flag&0xff000000)>>>24 ));
pw.print((char) ((flag&0x00ff0000)>>>16 ));
pw.print((char) ((flag&0x0000ff00)>>>8 ));
pw.print((char) (flag&0x000000ff) );
pw.print(' ') ;
}
else {
pw.print(transval( (short)((flag&0xffff0000)>>>16) )) ;
pw.print(' ') ;
pw.print(transval( (short)(flag&0x0000ffff) )) ;
pw.print(' ') ;
}
}

pw.flush() ;
ds.close();
pw.close() ;
}
catch(java.io.EOFException e1){}
catch(FileNotFoundException e2){}
catch(IOException e3){}
}
}


6.Re:Mr. jiangns3000,可否进来看一下。 [Re: dingsc] Copy to clipboard
Posted by: jiangns3000
Posted on: 2003-03-30 17:25

附上相应的class.

Trans.class (1.88k)

7.Re:Mr. jiangns3000,可否进来看一下。 [Re: jiangns3000] Copy to clipboard
Posted by: dingsc
Posted on: 2003-03-30 23:16

jiangns3000 wrote:
1000个数据中肯定不会出现N***?我的意思是:开头的第一个N***由数据文件的前四个ASCII决定,以后的N***在前一个基础上加1,其有9个N***?以上理解若正确,则程序很快即能完成。

1000个数据中肯定不会出现N***. 每个文件只有8个N***。而且必为N110~N118,N160~N168,N210~N218,N260~N268,N310~N318,N360~N368,N410~N418,N460~N468.等8种类型。

8.Re:Mr. jiangns3000,可否进来看一下。 [Re: dingsc] Copy to clipboard
Posted by: dingsc
Posted on: 2003-03-30 23:27

Mr. jiangns3000大虾,谢谢!^_^

9.Re:Mr. jiangns3000,可否进来看一下。 [Re: dingsc] Copy to clipboard
Posted by: dingsc
Posted on: 2003-03-31 21:49

Mr. jiangns3000大虾:
现在单个文件的转换可以了。真的很感谢你的帮忙。
再提一个问题:若要大批量的类似文件,可有何好方法实现。
dingsc@etang.com

10.Re:Mr. jiangns3000,可否进来看一下。 [Re: dingsc] Copy to clipboard
Posted by: jiangns3000
Posted on: 2003-03-31 22:05

当然可以。只要你的原始数据文件取名有规则,比如:以DAxxxxxx.bin(其中:xxxxxx是000001到999999的数字)命保,则程序可对它进行批量处理。一句话,使程序支持带通配符的文件(从而批量处理)。

11.Re:Mr. jiangns3000,可否进来看一下。 [Re: jiangns3000] Copy to clipboard
Posted by: dingsc
Posted on: 2003-03-31 23:39

jiangns3000 wrote:
当然可以。只要你的原始数据文件取名有规则,比如:以DAxxxxxx.bin(其中:xxxxxx是000001到999999的数字)命保,则程序可对它进行批量处理。一句话,使程序支持带通配符的文件(从而批量处理)。

Hi,jiangns3000,辛苦您了。现在还在动脑筋。
我的文件不太有规律,文件名是用系统时间来定的,扩展名则有点规律,可预知的,如101/102/318....,根据来源文件,可事先加到程序中。
拜托啦!^_^

12.Re:Mr. jiangns3000,可否进来看一下。 [Re: dingsc] Copy to clipboard
Posted by: jiangns3000
Posted on: 2003-04-01 08:02

简单的做法可否这样:将要转换的大批量的文件放在一个或几个文件夹中,程序对这些文件夹中所有文件一下子全转换。这样,只要将文件夹(一个或多个)作为命令行参数传入即可。

13.Re:Mr. jiangns3000,可否进来看一下。 [Re: jiangns3000] Copy to clipboard
Posted by: dingsc
Posted on: 2003-04-01 09:02

jiangns3000 wrote:
简单的做法可否这样:将要转换的大批量的文件放在一个或几个文件夹中,程序对这些文件夹中所有文件一下子全转换。这样,只要将文件夹(一个或多个)作为命令行参数传入即可。

这样处理不错,将文件夹中所有文件转换到另外文件夹。就有劳大虾再帮我改一下。真的很感谢你,帮我解决了一个问题。
关于该文件的转换,我当时读取的是Byte,所以不太好处理。你的思路真的太好了。
可否给个Email,我想大虾帮我看个程序结构。指点一下迷津。

14.Re:Mr. jiangns3000,可否进来看一下。 [Re: dingsc] Copy to clipboard
Posted by: jiangns3000
Posted on: 2003-04-01 10:24

jiangns3000@yahoo.com.cn
以后多交流。

15.Re:Mr. jiangns3000,可否进来看一下。 [Re: jiangns3000] Copy to clipboard
Posted by: dingsc
Posted on: 2003-04-01 10:56

jiangns3000 wrote:
jiangns3000@yahoo.com.cn
以后多交流。

Re:Mr. jiangns3000大侠,请查收email。谢谢!

16.Re:Mr. jiangns3000,可否进来看一下。 [Re: dingsc] Copy to clipboard
Posted by: jiangns3000
Posted on: 2003-04-01 11:46

批处理数据文件的程序见下边。将一个目录下所有数据文件全转换成另一个目录下文件。已用你原始数据文件测试过。如:设d:\test1目录下有四个数据文件:01152358.414,11152358.414,21152358.414,31152358.414。(文件名随意)转换结果放在d:\test2目录下。转换后结果文件是在原文件名后加上.txt。是一个纯文本文件。此时在d:\test2下有四个相应文件:01152358.414.txt,11152358.414.txt,21152358.414.txt,31152358.414.txt。
程序用法:java Transbat 源数据文件目录 结果文件目录
如:上例:java Transbat d:\test1 d:\test2
注:后边不要加 \

import java.io.*;

public class Transbat {
static private int Nxxx;
static boolean isFlag(int val) {
int i = Nxxx;
int j;
for (j = 0; j <= 8; j++) //Nxxx其9个
if (val == i + j)
return true;
return false;
}

static short transval(short val) {
int left, right;
right = val & 0x00ff;
left = val & 0xff00;
return (short) ( (right << 8) | (left >>> 8));
}

public static void main(String[] args) {
if (args.length != 2) {
System.out.println("用法:Transbat 数据文件目录 结果文件目录<回车> ");
System.exit(1);
}

int i;
PrintWriter pw;
DataInputStream ds;
File sdir = new File(args[0]);
File ddir = new File(args[1]);
File[] dataFiles = sdir.listFiles();

for (i = 0; i < dataFiles.length; i++) { //for begin
try {
pw = new PrintWriter(new FileWriter(ddir.getAbsolutePath()+"\\"+dataFiles[i].getName() +".txt" ), true);
ds = new DataInputStream(
new FileInputStream(dataFiles[i]));
int left, right, flag;
//读Nxxx
Nxxx = flag = ds.readInt();
//处理第一个Nxxx
pw.println();
pw.print( (char) ( (flag & 0xff000000) >>> 24));
pw.print( (char) ( (flag & 0x00ff0000) >>> 16));
pw.print( (char) ( (flag & 0x0000ff00) >>> 8));
pw.print( (char) (flag & 0x000000ff));
pw.print(' ');
//处理其它的数据及Nxxx
while (ds.available() > 0) {
flag = ds.readInt();
if (isFlag(flag)) {
pw.println();
pw.print( (char) ( (flag & 0xff000000) >>> 24));
pw.print( (char) ( (flag & 0x00ff0000) >>> 16));
pw.print( (char) ( (flag & 0x0000ff00) >>> 8));
pw.print( (char) (flag & 0x000000ff));
pw.print(' ');
}
else {
pw.print(transval( (short) ( (flag & 0xffff0000) >>> 16)));
pw.print(' ');
pw.print(transval( (short) (flag & 0x0000ffff)));
pw.print(' ');
}
}

pw.flush();
ds.close();
pw.close();
}

catch (java.io.EOFException e1) {}
catch (FileNotFoundException e2) {}
catch (IOException e3) {}
}//for end
}
}

附上相应的Transbat.class

Transbat.class (2.47k)

17.Re:Mr. jiangns3000,可否进来看一下。 [Re: dingsc] Copy to clipboard
Posted by: dingsc
Posted on: 2003-04-01 17:09

Mr. jiangns3000,该程序现在得到了完整的解决。真的很佩服你!
由于该程序无法在jdk1.1.8上运行,看来我真的要装j2sdk1.4.1了。
在win98环境,可好用?
顺便提个请求,若时间精力允许的话,拜托就我的email所提的问题,给点意见。谢谢!
dingsc@etang.com


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923