【问题标题】:How do I read a .csv file in Java with some cells containing multiple lines?如何在 Java 中读取包含多行的某些单元格的 .csv 文件?
【发布时间】:2015-04-03 03:49:26
【问题描述】:

我正在尝试在 Java 程序中读取 .csv 文件。该文件有一些包含多行的单元格。

我使用的是 linux 操作系统,所以我尝试使用以下内容删除换行符:

awk -v RS="" '{gsub (/\n/,"")}1' cleanPaperAuthor.csv > cleanPaperAuthor1.csv

该 DID 导致单元格中的多行数据全部显示在一行上。但是当我尝试在java中读入文件时,阅读器仍然认为它在单元格数据的中间遇到了行尾。

所以我尝试了 awk -v RS="" '{gsub (/\r/,"")}1' cleanPaperAuthor1.csv > cleanPaperAuthor2.csv

这导致 .csv 文件中的所有数据都放在一行中。

然后我尝试了 awk -v RS="" '{gsub (/\r\n/,"")}1' cleanPaperAuthor.csv > cleanPaperAuthor3.csv.

我还不确定这是否有效 - 我仍在打开文件的过程中。

我知道那里有一个 CSVReader 类,但我真的很想弄清楚我可以做什么,而不必处理设置和更改我的代码。有没有人有任何想法?我现在完全糊涂了。

【问题讨论】:

  • 如果你打算使用java,你为什么要摆弄awk?
  • 因为我不知道修复文件的简单方法。我需要将多行单元格更改为单行,其中没有 。 .csv 文件太大而无法打开和编辑 - 大约 617,000 字节。如果在 Java 中有一种简单的方法可以做到这一点,我完全赞成。
  • 问题是我不确定你的 .csv 文件是什么样子的。如果单元格可以有换行符,那么什么会终止一行?
  • 我完全不知道。我试图在写字板中打开它来编辑它并去掉多行单元格,但我的应用程序因为文件太大而冻结了。
  • 实际上,我刚刚浏览了 Ravi 指向您的 OpenCSV 源代码。诀窍是引号。只要您的单元格不仅用逗号分隔而且用引号括起来,那么单元格中的新行仅适用于该单元格而不是该行。如果您的单元格被引用,那么 OpenCVS 应该可以满足您的要求。

标签: java linux csv


【解决方案1】:

使用 CSV 解析器非常简单;设置和 API。而且,除了处理跨越多行的值之外,它还可以处理引号元素中的逗号等问题,并为您解析引号 "" 等内的值。此外,您还可以使用该库将文本序列化回 CSV。

这是一个使用 OpenCSV 读取一行 csv 值的示例。

    String input = "value1, \"value2\", \"value3, 1234\", \"value4\n"
            + "value5\n"
            + "value6\"";

    try (CSVReader reader = new CSVReader(new StringReader(input))) {
        String [] tokens;
        while ((tokens = reader.readNext()) != null) {
            System.out.println(Arrays.toString(tokens));
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

输出: (“value3, 1234”是一个值。)

[value1, value2, value3, 1234, value4
value5
value6]

只需确保将Apache Commons Lang 3.x jar 添加到您的类路径

【讨论】:

  • 谢谢,拉维。我已经加入了 OpenCSV - 但是,它并没有解决我的问题。不过现在问题已经解决了。当我读入每个字符串时,我会从字符串中删除任何/所有 \n 字符。不确定之前的问题是什么,我的猜测是我可能无意中更改了文件,因此它没有被读取为真正的 .csv 文件。
  • 是的,我怀疑您的一个 awk 命令已将 newlines 替换为文字字符串 "\n",即两个字符 '\''n'。否则我的解决方案会奏效。但是,很高兴知道你已经整理好了 :)
  • 我试图解析从 SO/SEDE 表生成的 csv,没有解决问题。
【解决方案2】:
        String UPLOADED_FOLDER = "/home/Rahul/Developement/Rahul/personal/uploadedfile/";
        try {

            // ** get the file and store at to that location **

            byte[] bytes = file.getBytes();
            Path path = Paths.get(UPLOADED_FOLDER + file.getOriginalFilename());
            Files.write(path, bytes);

            redirectAttributes.addFlashAttribute("You successfully uploaded '" + file.getOriginalFilename() + "'");

        } catch (IOException e) {
            e.printStackTrace();
        }

        try {

            String fileName = file.getOriginalFilename();

            System.out.println("/home/Rahul/Developement/Rahul/personal/uploadedfile/" + fileName);

            String filePath = new File("/home/Rahul/Developement/Rahul/personal/uploadedfile/")
                    .getAbsolutePath();

            boolean check = true;

            File file1 = new File("/home/Rahul/Developement/Rahul/personal/uploadedfile/" + fileName);

            System.out.println(file1.exists());

            // TO CHECK FILE IS CSV OR NOT
            if (fileName.endsWith(".csv")) {

                check = true;

                System.out.println("extension");

                if (!fileName.isEmpty()) {

                    // *** to read the file from the location
                    // **("/home/Rahul/Developement/Rahul/personal/uploadedfile/")**

                    BufferedReader br = new BufferedReader(new FileReader(
                            "/home/Rahul/Developement/Rahul/personal/uploadedfile/" + fileName));

                    InputStream is = new FileInputStream(
                            "/home/Rahul/Developement/Rahul/personal/uploadedfile/" + fileName);
}

【讨论】:

    猜你喜欢
    • 2016-11-22
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 2014-01-20
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    相关资源
    最近更新 更多