Java: CSV 文件易于读写

7
我正在开发一个需要快速访问CSV逗号分隔的电子表格文件的程序。 到目前为止,我已经通过使用BufferedReader方便地读取了它。 然而,现在我想能够编辑它读取的数据,然后将其导出回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);
    }
};

我希望有人能提供思路,让我知道如何操作。

4
并非直接回答你的问题:你是否了解SuperCSV,它是一款易于使用且多才多艺的CSV读写库,可大大方便与CSV文件的交互。 - fvu
5个回答

18

您可以查看OpenCSV,它支持读写CSV文件而无需重新发明轮子。以下是阅读和写入的示例。


这很容易说,但在商业应用中,他们的许可证怎么样?因为我们都在开发商业应用程序... - Fico

2
请考虑使用 Apache commons csv 来处理 CSV 文件。为了快速理解 API,有四个重要的类:

CSVFormat

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

CSVParser

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

CSVPrinter

以 CSV 格式打印值。

CSVRecord

从 CSV 文件中解析出的 CSV 记录。

代码示例: enter image description here

单元测试代码: enter image description here


9
最好在此处发布源代码,而不是图片。 - Basil Bourque

1
电子表格包含姓名、电话号码、电子邮件地址等信息。程序列出每个人的数据,当您单击它们时,会弹出一个页面,显示更详细的信息,也从CSV中提取。在该页面上,您可以编辑数据,并希望能够单击“保存更改”按钮,然后将数据导出回其适当的行中的CSV文件,或删除旧数据并追加新数据。
文件的内容是一系列字节。CSV是一种基于文本的文件格式,即字节序列被解释为字符序列,其中换行符由特殊的换行符分隔。
因此,如果一行的长度增加,则必须移动所有后续行的字符以腾出空间来容纳新字符。同样,要删除一行,必须移动后面的字符以填补空白。也就是说,您无法更新CSV文件中的一行(至少在更改其长度时不行)而不重写文件中的所有后续行。为简单起见,我会重写整个文件。

既然您已经有编写和读取CSV文件的代码,那么适应它可能会很简单。但在此之前,值得问一下自己是否使用了正确的工具。如果目标是保留记录列表,并在表单中编辑单个记录,则Microsoft Access或类似的Open Office程序可能更适合。如果您的用户界面需求超过这些程序所提供的功能,那么使用关系数据库来存储数据可能更适合(比CSV更高效灵活)。


0

我用以下方法解决了

    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-csv</artifactId>
        <version>2.8.6</version>
    </dependency>

并且

  private static final CsvMapper mapper = new CsvMapper();
  public static <T> List<T> readCsvFile(MultipartFile file, Class<T> clazz) throws IOException {
    InputStream inputStream = file.getInputStream();
    CsvSchema schema = mapper.schemaFor(clazz).withHeader().withColumnReordering(true);
    ObjectReader reader = mapper.readerFor(clazz).with(schema);
    return reader.<T>readValues(inputStream).readAll();
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接