繁体   English   中英

将数据添加/附加到现有 CSV 文件的特定行/单元格

[英]Add/append data to specific row/cell of an existing CSV file

我正在尝试将 append 的值添加到 csv 文件中的特定行,但附加的默认值是在 csv 文件的末尾添加值。 不完全确定如何在特定行的末尾告诉它 append。 我的代码如下所示:

try {
        writer = new FileWriter(csvFile ,true);
        br = new BufferedReader(new FileReader(csvFile));
        while ((line = br.readLine()) != null) {

            // use comma as separator
            String[] id = line.split(cvsSplitBy);

            if(id[0].equals("1")){
                writer.append(",");
                writer.append("Success");
                System.out.println("Done");
            }
        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (br != null) {
            try {
                br.close();
                writer.flush();
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

目标是使程序添加“成功”,其中 csv 行 id 等于 1。当前结果是:

Id,Name,Sex,Age
1,Nick,Male,23
2,Dick,Male,25,Success

我想要的是:

Id,Name,Sex,Age
1,Nick,Male,23,Success
2,Dick,Male,25

任何帮助,将不胜感激。 谢谢。

您不能只是追加到一行的末尾,并期望以下各行保持原样。 考虑一下文本文件的结构,例如,其中包含以下几行:

one
two

该文件包含以下字符序列:

“ o”,“ n”,“ e”,“ \\ n”,“ t”,“ w”,“ o”,“ \\ n”

现在,如果在第1行的末尾添加更多字符,则将覆盖第2行。

因此,当您在一行的末尾插入字符时,您需要移动文件的其余部分以留出空间。 这意味着您必须复制文件其余部分的内容,写入“,Success”字符串,然后将保存的字符复制回该文件。

但是,您正在创建一个将append标志设置为true的FileWriter。 这意味着每次写操作都会追加到文件末尾。 您需要做的而不是附加操作,是标记您需要书写的位置,然后在该位置开始书写。 也许执行此操作最简单的类是RandomAccessFile。

由于CSV行以CRLF(或仅是LF)终止,因此您可以将文件的全部内容读入字符串中,并使用正则表达式将SuccessLFLF替换为CRLF。

正则表达式将如下所示:

1。*(\\ r \\ n)

给您\\ r \\ n作为编号的捕获组。

希望这可以帮助

是的,您可以做到这一点,但不是直截了当....您需要在开始时读取和 append 您的数据然后写入新文件,这将覆盖。

查找以下示例:
1 - 读取文件,保留 header 分开然后内容分开
2 - 将新的内容/行数据添加到开始列表
3 - 将 header 添加到开头,因为我们希望 header 应该是第一个
4 - 然后将整个数据写入.csv 文件
代码(您需要在 pom 中为 CSVWritter/CSVReader 添加 jar/依赖项)-

   try {
        FileReader filereader = new FileReader(file);

        CSVReader csvReader = new CSVReaderBuilder(filereader).build();
        String[] header = csvReader.readNext();
        List<String[]> allData = csvReader.readAll();
        FileWriter outputfile = new FileWriter(file, false);
        CSVWriter writer = new CSVWriter(outputfile);

        String[] data = {"test1", "test2"};
        allData.add(0,data);
        allData.add(0,header);
        for (String[] dt : allData){
            writer.writeNext(dt);
        }
        // closing writer connection
        writer.close();
    }
    catch (Exception e) {
        e.printStackTrace();
    }

享受:)

暂无
暂无

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

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