[100分求助]JAVA读取、处理txt文件并把结果写入新txt
本帖最后由 fanalin000 于 2012-07-23 10:36:17 编辑 要用Java写个东西读取txt中的数据,若id1或者id2的值不同,就插入END,START(详细见结果),最后只输出修改后的id3列。我对java不熟,读入txt和写出新txt还是能自己弄的,但是不会比较id1的值或者id2的值,请大家帮忙,最好带注释,谢谢
源文件:
id1 id2 id3
100037 1 Q
100037 1 SR
100037 1 Q
100037 1 SR
100039 1 Q
100039 1 SR
100044 1 Q
100044 1 SR
100048 1 Q
100048 1 Q
100048 1 SR
100048 2 Q
100048 2 Q
100048 2 SR
100078 1 Q
100078 1 SH
100078 1 SR
100078 1 Q
希望得到的结果:
START
Q
SR
Q
SR
END
START
Q
SR
END
START
Q
SR
END
START
Q
Q
SR
END
START
Q
Q
SR
END
START
Q
SH
SR
Q
END
[最优解释]
package com.li;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Set;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader buf = new BufferedReader(new InputStreamReader(new FileInputStream(new File("e:/1.txt"))));
String temp = "";
Set<Text> texts = new TreeSet<Text>();
while((temp=buf.readLine())!=null){
Text text= new Text(temp);
texts.add(text);
}
for (Text text : texts) {
System.out.println("START\n"+text.getContent()+"\nEND");
}
}
}
class Text implements Comparable<Text>{
private String content =null;
private String header = null;
public Text(String content){
setContent(content);
this.header = content.split(" ")[0];
this.content = content.split(" ")[2];
}
@Override
public int compareTo(Text o) {
if(header.equals(o.getHeader())){
o.setContent(o.getContent()+"\n"+content);
return 0;
}else return 1;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getHeader() {
return header;
}
public void setHeader(String header) {
this.header = header;
}
}
[其他解释]
public static void main(String[] args) throws Exception {
FileReader fr = new FileReader("d:\\from.txt");
BufferedReader br = new BufferedReader(fr);
StringBuffer buf = new StringBuffer();
FileWriter fw = new FileWriter("d:\\to.txt");
BufferedWriter bw = new BufferedWriter(fw);
String line = null;
br.readLine();
String id1temp = "";
String id2temp = "";
if((line = br.readLine()) != null){
buf.append("START");
buf.append("\r\n");
buf.append(line.split(" ")[2]);
buf.append("\r\n");
id1temp = line.split(" ")[0];
id2temp = line.split(" ")[1];
}
while((line = br.readLine()) != null){
String[] ids = line.split(" ");
String id1 = ids[0];
String id2 = ids[1];
String id3 = ids[2];
if(!id1temp.equals(id1)
[其他解释]
你既然可以对txt进行读取,那么你可以把这些数据一行一行的装进一个List里面,同时你又可以把每行的数据解析成一个数组,你这里可以根据空格进行分割就是一个数组了,这样的话,你只要循环这个数组,判断数组的第一个位置的值和第2个位置的值就可以
[其他解释]
line.split(" ") 是一个数组
line.split(" ")[0] 是取这个数组的第一个元素。
文件第一行是 id1 id2 id3
从第二行开始才是数据
100037 1 Q
100037 1 SR
.........
.........
所以从第二行开始计算
[其他解释]
自己顶,求指导
[其他解释]
该回复于2012-07-23 10:39:53被版主删除
[其他解释]
楼上的兄弟,很清楚。不行,再GOOGLE一下啦
[其他解释]
初学Java,还不了解List的用法,搜代码的时候曾经看过有用Map的,这两个一样吗?
[其他解释]
谢谢,参考代码学习一下。
------其他解决方案--------------------
!id2temp.equals(id2)){
buf.append("END");
buf.append("\r\n");
buf.append("START");
buf.append("\r\n");
id1temp = id1;
id2temp = id2;
}
buf.append(id3);
buf.append("\r\n");
}
buf.append("END");
bw.write(buf.toString());
bw.close();
br.close();
}
逻辑挺清楚的,楼主应该能看懂。
[其他解释]
id1temp = line.split(" ")[0];这个表示什么?
PS:代码是从第二行开始读数据的,我找了好半天也不知道应该在哪里改。。。
[其他解释]
这写都是基础了,你可以参考者API去看上面代码,主要 是java.lang包下String 这个类的方法
[其他解释]
我明白split表示用后面的空格来切分数据,但是不清楚为什么表示第一列的[0]要写在后面,没找到对应的格式啊,你所说的lang包下也没有找到详细说明。
[其他解释]
Google下Tokenizer,写个切割字符串的方法把id1,id2切开来各存一个String,然后下面的存成list,ArrayList,数组啥都的行,取个SIZE或者LENGTH,按照那个做个循环匹配,匹配完,操作完再合上……要留啥就留啥……不要的就不合进去……
[其他解释]
为什么不用数据库呢?那样的话修改字段很简单的,对文件操作要修改字段的内容,有点复杂。。
[其他解释]
比较困难的一个问题。
[其他解释]
慢慢来吧,先去理解 基础,然后参考别人代码
现看懂,然后多敲代码吧
[其他解释]
初学者,还不懂啊