Java:CSV文件易于读​​/写

时间:2013-01-09 01:14:22

标签: java csv file-io line bufferedwriter

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

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

我不太熟悉使用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);
    }
};

我希望有人知道如何做到这一点?

4 个答案:

答案 0 :(得分:18)

您可以查看支持读取和写入CSV文件的OpenCSV,而不是重新发明轮子。以下是reading & writing

的示例

答案 1 :(得分:1)

  

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

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

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

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

答案 2 :(得分:1)

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

  

CSVFormat

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

  

CSVParser

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

  

CSVPrinter

以CSV格式打印值。

  

CSVRecord

从CSV文件解析的CSV记录。

代码示例: enter image description here

单元测试代码: enter image description here

答案 3 :(得分:0)

添加依赖

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