如何使用java在csv文件中更新和删除?

时间:2016-05-04 15:51:29

标签: java csv io

我有一个包含100 000条记录的.CSV文件。我需要解析一组记录然后删除它。然后再次解析下一组记录直到结束。怎么做?代码片段非常有用。

我尝试了但是我无法删除记录并重复使用剩余的记录集留下的相同CSV文件。

3 个答案:

答案 0 :(得分:1)

这不能有效地完成,因为CSV是一种顺序文件格式。说你有

"some text", "adsf"
"more text", "adfgagqwe"
"even more text", "adsfasdf"
...

并且您要删除第二行:

"some text", "adsf"
"even more text", "adsfasdf"
...

你需要向后移动所有后续行(在你的情况下可以是10万......),这包括在旧位置读取它们并将它们写入新的行。也就是说,删除10万行中的第一行涉及读写99 999行文本,这需要一段时间......

因此值得考虑替代方案。例如,如果您正在尝试处理文件,并且想要跟踪您获得的距离,那么存储您所在的行号(或以字节为单位的偏移量)的效率会更高,并保持输入文件的完整性。如果您的程序在删除行时崩溃,这也可以防止损坏文件。另一种方法是首先将文件拆分为许多小文件(每个文件大约1000行),完整处理每个文件,然后删除文件。

但是,如果您真的必须从CSV文件中删除行,最强大的方法是读取整个文件,将要保留的所有记录写入新文件,删除原始文件,最后重命名新文件到原始文件。

答案 1 :(得分:0)

您无法编辑或删除文件的现有数据。理想情况下,您应该为输出生成一个新文件。在您的情况下,一旦您到达删除现有数据的点,您可以创建一个新文件,将剩余的行复制到该文件并使用此新文件作为输入 代码:

File infile =new File("C:\\MyInputFile.txt");
File outfile =new File("C:\\MyOutputFile.txt");
instream = new FileInputStream(infile);
outstream = new FileOutputStream(outfile);

byte[] buffer = new byte[1024];
int length;
/*copying the contents from input stream to
 * output stream using read and write methods
 */
while ((length = instream.read(buffer)) > 0){
  outstream.write(buffer, 0, length);
}
//Closing the input/output file streams
instream.close();
outstream.close();

答案 2 :(得分:0)

下面的代码测试工作正常,你可以使用下面的代码擦除现有csv文件中的任何一行,所以请检查并告诉我,你必须将行号放在数组中才能删除,

    File f=new File(System.getProperty("user.home")+"/Desktop/c.csv");

    RandomAccessFile ra=new RandomAccessFile(f,"rw");
    ra.seek(0);

    long p=ra.getFilePointer();
    byte b[]=ra.readLine().getBytes();


    char c=' ';//44 for comma 32 for white space



    for(int i=0;i<b.length;i++){

        if(b[i]!=44){//Replace all except comma
            b[i]=32;
        }
    }

    ra.seek(p);//Go to intial pointer of line
    ra.write(b);//write blank line with commas as column separators                    

    ra.close();