我试图读取一个文本文件,然后进行一些操作,然后将记录更新为一个新的文本文件。
这是我到目前为止所拥有的:
ArrayList<String> linesList = new ArrayList<>();
BufferedReader br;
String empid, email;
String[] data;
try {
String line;
br = new BufferedReader(new FileReader("file.txt"));
while ((line = br.readLine()) !=null) {
linesList.add(line);
}
br.close();
}
catch (IOException e) { e.printStackTrace(); }
for (int i = 0; i < linesList.size(); i++) {
data = linesList.get(i).split(",");
empid = data[0];
ccode = data[3];
}
File tempFile = new File("File2.txt");
BufferedWriter bw = new BufferedWriter(new FileWriter(tempFile));
for (int i = 0; i < linesList.size(); i++) {
if(i==0){
bw.write(linesList.get(i));
bw.newLine();
}
else{
data = linesList.get(i).split(",");
String empid1 = data[0];
if(data[13].equals("IND")) {
String replace = data[3].replaceAll("IND", "IN");
ccode1 = replace;
System.out.println(ccode1);
}
else if(data[13].equals("USA")) {
String replace = data[3].replaceAll("USA", "US");
ccode1 = replace;
}
else {
ccode1 = replace; //This does not work as replace is not defined here, but how can I get it to work here.
}
String newData=empid1+","+ccode1;
bw.write(newData);
bw.newLine();
}
}
以下是文本文件中的内容:
EID,First,Last,Country
1,John,Smith,USA
2,Jane,Smith,IND
3,John,Adams,USA
因此,我需要帮助的是编辑三个字母的国家代码,然后将其替换为两个字母的国家代码。例如:美国将成为美国,而IND将成为IN。我可以读取国家/地区代码,但是在更改值然后将更改后的值替换回另一个文本文件时遇到麻烦。任何帮助表示赞赏。预先感谢。
答案 0 :(得分:0)
在文本编辑器中打开文件,搜索和替换,将,USA
替换为,US
,将,IND
替换为,IN
,依此类推。
这样,要使其自动化,请在同一while循环中读取一行:
//while(read){
line.replaceAll(",USA",",US");
这是完成目标的最简单方法。
要保存,请像打开阅读器并使用BufferedWriter bw;
一样打开bw.write()
。您可能希望同时打开两个文件名,后缀为_out
,同时打开源文件的阅读器和新文件的书写器。这样一来,您无需将文件数据保存在内存中,就可以在循环时进行读写操作。
有关更困难的方法,请阅读csv规范:https://tools.ietf.org/html/rfc4180#section-2
请注意,您必须考虑将字段用引号引起来的可能性,例如:"1","John","Smith","USA"
,这意味着您还必须将,\"USA
替换为,\"US
。
分隔符不一定是逗号,您必须确保您的输入将始终使用相同的分隔符,或者您可以在运行时检测并切换。
您必须考虑以下情况:分隔符可能是字段的一部分,或者引号是字段的一部分。
现在您知道/可以解决这些问题,您可以使用while( (/*int*/ c = br.read()) != -1)
逐字符解析行,而不必使用replace,并使用if门手动进行此替换。
/*while(read)*/
if( c == delimiter ){
if not field, start next field, else add to field value
} else if( c == quote ){
if field value empty, ignore and expect closing quote, else if quote escape not marked, mark it, else, add quote to field value
}
(...)
} else if( c == 13 or c == 10 ){
finished line, check last field of row read and replace data
}
要使其变得更好/更难,请定义一个解析状态机,将状态放入Enum中,并牢记它们的if门(这将使您的代码更像是编译器解析器)。
您可以在以下不同阶段找到解析代码:https://www.mkyong.com/java/how-to-read-and-parse-csv-file-in-java/
答案 1 :(得分:0)
您需要对概念进行一些更改。如果您要编辑文件, 创建一个新文件并在新文件中写入内容,删除旧文件并重命名新文件 老名字。
ArrayList<String> linesList = new ArrayList<>();
BufferedReader br;
String[] data;
File original=new File("D:\\abc\\file.txt");
try {
String line;
br = new BufferedReader(new FileReader(original));
while ((line = br.readLine()) !=null) {
linesList.add(line);
}
br.close();
}
catch (IOException e) { e.printStackTrace(); }
File tempFile = new File("D:\\abc\\tempfile.txt");
BufferedWriter bw = new BufferedWriter(new FileWriter(tempFile));
for (int i = 0; i < linesList.size(); i++) {
if(i==0){
bw.write(linesList.get(i));
bw.newLine();
}
else{
data = linesList.get(i).split(",");
String empid = data[0];
String name=data[1];
String lname=data[2];
String ccode = data[3].substring(0, 2);
String newData=empid+","+name+","+lname+","+ccode+"\n";
bw.write(newData);
bw.newLine();
}
}
bw.close();
if (!original.delete()) {
System.out.println("Could not delete file");
return;
}
// Rename the new file to the filename the original file had.
if (!tempFile.renameTo(original))
System.out.println("Could not rename file");