【问题标题】:Java: CSV File Easy Read/WriteJava:CSV文件易读/写
【发布时间】:2012-12-23 00:07:21
【问题描述】:

我正在开发一个需要快速访问 CSV 逗号分隔电子表格文件的程序。 到目前为止,我已经能够使用 BufferedReader 轻松读取它。 但是,现在我希望能够编辑它读取的数据,然后将其导出回 CSV。

电子表格包含姓名、电话号码、电子邮件地址等。该程序列出了每个人的数据,当您单击它们时,它会打开一个包含更多详细信息的页面,这些信息也是从 CSV 中提取的。在该页面上,您可以编辑数据,并且我希望能够单击“保存更改”按钮,然后将数据导出回 CSV 中的相应行 - 或删除旧的,并附加新的。

我不太熟悉使用 BufferedWriter,或者我应该使用的任何东西。

我开始做的是创建一个名为 FileIO 的自定义类。它同时包含一个 BufferedReader 和一个 BufferedWriter。到目前为止,它有一个返回 bufferedReader.readLine() 的方法,称为 read()。现在我想要一个名为 write(String line) 的函数。

public static class FileIO {
    BufferedReader read;
    BufferedWriter write;

    public FileIO (String file) throws MalformedURLException, IOException {
        read = new BufferedReader(new InputStreamReader (getUrl(file).openStream()));
        write = new BufferedWriter (new FileWriter (file));
    }

    public static URL getUrl (String file) throws IOException {
        return //new URL (fileServer + file).openStream()));
                FileIO.class.getResource(file);
    }

    public String read () throws IOException {
        return read.readLine();
    }

    public void write (String line) {
        String [] data = line.split("\\|");
        String firstName = data[0];

        // int lineNum = findLineThatStartsWith(firstName);
        // write.writeLine(lineNum, line);
    }
};

我希望有人知道我该怎么做?

【问题讨论】:

  • 不是你的问题本身的答案:你知道SuperCSV,一个易于使用的多功能 CSV 读写库,它极大地促进了与 csv 文件的交互。

标签: java csv file-io line bufferedwriter


【解决方案1】:

与其重新发明轮子,不如看看支持读取和写入 CSV 文件的 OpenCSV。以下是reading & writing的示例

【讨论】:

  • 这说起来容易,但是他们的商业应用许可证呢?因为我们不是都在开发商业应用吗...
【解决方案2】:

电子表格包含姓名、电话号码、电子邮件地址等。该程序列出了每个人的数据,当您单击它们时,它会打开一个包含更多详细信息的页面,这些信息也是从 CSV 中提取的。在该页面上,您可以编辑数据,并且我希望能够单击“保存更改”按钮,然后将数据导出回 CSV 中的相应行 - 或删除旧的,并附加新的。

文件的内容是一个字节序列。 CSV 是一种基于文本的文件格式,即字节序列被解释为字符序列,其中换行符由特殊换行符分隔。

因此,如果一行的长度增加,则需要移动所有后续行的字符,以便为新字符腾出空间。同样,要删除一行,您必须移动后面的字符以填补空白。也就是说,如果不重写文件中的所有后续行,则无法更新 csv 中的行(至少在更改其长度时不能)。为简单起见,我将重写整个文件。

由于您已经有了编写和读取 CSV 文件的代码,因此对其进行调整应该很简单。但在你这样做之前,可能值得问问自己你是否使用了正确的工具来完成这项工作。如果目标是保留记录列表,并在表单中编辑单个记录,则 Microsoft Access 或任何类似 Open Office 的程序可能更适合。如果您的 UI 需求超出了这些程序所提供的范围,那么使用关系数据库来保存您的数据可能更合适(比 CSV 更高效、更灵活)。

【讨论】:

    【解决方案3】:

    请考虑Apache commons csv。 为了快速理解api,有四个重要的类:

    CSV格式

    指定 CSV 文件的格式并解析输入。

    CSV解析器

    根据指定的格式解析 CSV 文件。

    CSVPrinter

    以 CSV 格式打印值。

    CSV 记录

    从 CSV 文件解析的 CSV 记录。

    代码示例:

    单元测试代码:

    【讨论】:

    • 最好在这里发布源代码而不是图片。
    【解决方案4】:

    添加依赖

    implementation 'com.opencsv:opencsv:4.6'
    

    在 onCreate() 中添加下面的代码

    InputStreamReader is = null;
            try {
                  String path= "storage/emulated/0/Android/media/in.bioenabletech.imageProcessing/MLkit/countries_image_crop.csv";
                
                 CSVReader reader = new CSVReader(new FileReader(path));
                 String[] nextLine;
                 int lineNumber = 0;
                 while ((nextLine = reader.readNext()) != null) {
                    lineNumber++;
    
                    //print CSV file according to your column 1 means first column, 2 means 
                      second column
                    Log.e(TAG, "onCreate: "+nextLine[2] );
                }
            }
            catch (Exception e)
            {
                 Log.e(TAG, "onCreate: "+e );
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      • 2013-05-12
      • 2013-05-21
      • 2021-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多