使用Java

时间:2018-08-31 02:43:47

标签: java

我试图读取一个文本文件,然后进行一些操作,然后将记录更新为一个新的文本文件。

这是我到目前为止所拥有的:

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。我可以读取国家/地区代码,但是在更改值然后将更改后的值替换回另一个文本文件时遇到麻烦。任何帮助表示赞赏。预先感谢。

2 个答案:

答案 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");