【问题标题】:updating specific cell csv file using java使用java更新特定的单元格csv文件
【发布时间】:2010-12-09 11:55:26
【问题描述】:

您好,我有一个小问题,我认为我只是没有在一行代码中获得正确的语法。基本上,我可以写入我的 csv 文件并使用字符串标记器查找特定记录,但它不会更新/编辑该记录的指定单元格。记录保持不变。请帮忙....

【问题讨论】:

  • 我们完全不知道你在做什么,所以我们无法判断你做错了什么......
  • 你的意思是它没有更新你的文件吗?如果您提供一个简短示例来说明您正在尝试做什么以及有关它如何失败的信息,那么这个问题会更容易回答。
  • 另外,如果您需要处理 csv 文件,您是否查看过任何可用的 Java csv 包?如果您正在做一些不平凡的事情,它们可能会让您的生活更轻松。

标签: java csv


【解决方案1】:

我在java中使用过http://opencsv.sourceforge.net

嗨, 这是通过指定行和列来更新 CSV 的代码

/**
 * Update CSV by row and column
 * 
 * @param fileToUpdate CSV file path to update e.g. D:\\chetan\\test.csv
 * @param replace Replacement for your cell value
 * @param row Row for which need to update 
 * @param col Column for which you need to update
 * @throws IOException
 */
public static void updateCSV(String fileToUpdate, String replace,
    int row, int col) throws IOException {

File inputFile = new File(fileToUpdate);

// Read existing file 
CSVReader reader = new CSVReader(new FileReader(inputFile), ',');
List<String[]> csvBody = reader.readAll();
// get CSV row column  and replace with by using row and column
csvBody.get(row)[col] = replace;
reader.close();

// Write to CSV file which is open
CSVWriter writer = new CSVWriter(new FileWriter(inputFile), ',');
writer.writeAll(csvBody);
writer.flush();
writer.close();
}

这个解决方案对我有用, 干杯!

【讨论】:

    【解决方案2】:

    我使用下面的代码将一个字符串替换为另一个字符串,它的工作方式完全符合我的需要:

    public static void updateCSV(String fileToUpdate) throws IOException {
            File inputFile = new File(fileToUpdate);
    
            // Read existing file
            CSVReader reader = new CSVReader(new FileReader(inputFile), ',');
            List<String[]> csvBody = reader.readAll();
            // get CSV row column and replace with by using row and column
            for(int i=0; i<csvBody.size(); i++){
                String[] strArray = csvBody.get(i);
                for(int j=0; j<strArray.length; j++){
                    if(strArray[j].equalsIgnoreCase("Update_date")){ //String to be replaced
                        csvBody.get(i)[j] = "Updated_date"; //Target replacement
                    }
                }
            }
            reader.close();
    
            // Write to CSV file which is open
            CSVWriter writer = new CSVWriter(new FileWriter(inputFile), ',');
            writer.writeAll(csvBody);
            writer.flush();
            writer.close();
        }
    

    【讨论】:

    • 救命稻草!我知道这是我需要做的,我在如何更新单元格和成功写入方面遇到了麻烦,但这填补了我逻辑中的空白和漏洞。谢谢!
    【解决方案3】:

    你正在做这样的事情:

      String line = readLineFromFile();
      line.replace(...);
    

    这不是在编辑文件,而是从文件中的一行创建一个新字符串

    String 实例是不可变的,因此您正在进行的 replace 调用会返回一个 new 字符串,它不会修改原始字符串。

    要么使用允许您读取和写入文件的文件流 - 即RandomAccessFile,要么(更简单地)写入新文件,然后用新文件替换旧文件

    在伪代码中:

    for (String line : inputFile) {
        String [] processedLine = processLine(line);
        outputFile.writeLine(join(processedLine, ","));
    }
    
    private String[] processLine(String line) {
        String [] cells = line.split(","); // note this is not sufficient for correct csv parsing.
        for (int i = 0; i < cells.length; i++) {
            if (wantToEditCell(cells[i])) {
               cells[i] = "new cell value";
            }
        }
    
        return cells;
    }
    

    另外,请查看this question。有一些库可以帮助您处理 csv。

    【讨论】:

    • 不确定如何实现 RAF,并且已经阅读了一些内容以通过代码为我指明正确的方向?
    【解决方案4】:

    CSV 文件只是一个文件。如果您正在阅读它,它不会被更改。 所以,写下你的改变吧!

    你有 3 种方法。

    1

    1. 逐行阅读,找到要更改的单元格。
    2. 根据需要更改单元格并合成当前行的新版本。
    3. 将该行写入第二个文件。
    4. 完成后,您将获得源文件和结果文件。现在,如果您愿意,可以删除源文件并将结果文件重命名为 source。

    2

    使用 RandomAccess 文件写入文件的特定位置。

    3

    使用 CSV 解析器的可用实现之一(例如 http://commons.apache.org/sandbox/csv/) 它已经支持您的需求并公开了高级 API。

    【讨论】:

      猜你喜欢
      • 2020-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 2019-02-25
      • 1970-01-01
      • 2019-05-07
      • 1970-01-01
      相关资源
      最近更新 更多