繁体   English   中英

如何使用Java更新和删除csv文件?

[英]How to update and delete in a csv file using java?

我有一个包含100000条记录的.CSV文件。 我需要解析一组记录,然后将其删除。 然后再次解析下一组记录,直到结束。 怎么做? 代码段将非常有帮助。

我试过了,但是我无法删除记录并重复使用剩下的记录集所剩的同一CSV文件。

由于CSV是顺序文件格式,因此无法有效完成。 说你有

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

并且您要删除第二行:

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

您需要向上移动所有后续行(在您的情况下为100 000 ...),这涉及在旧位置读取它们并将它们写入新位置。 也就是说,删除100000行中的第一行涉及读取和写入99999行文本,这将需要一段时间...

因此,值得考虑替代方案。 例如,如果您尝试处理文件,并希望跟踪到达的距离,则存储行号(或以字节为单位的偏移量)会更有效,而输入文件则保持完整。 如果您的程序在删除行时崩溃,这也可以防止损坏文件。 另一种方法是先将文件分成许多小文件(每个文件可能约1000行),完整地处理每个文件,然后删除该文件。

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

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

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();

下面的代码经过了测试,可以正常工作,您可以使用下面的代码擦除现有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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM