如何使用包含多行的单元格读取Java中的.csv文件?

时间:2015-04-03 03:49:26

标签: java linux csv

我正在尝试在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类,但我真的想知道我能做什么而不必处理设置和更改我的代码。那里有人有什么想法吗?我现在完全糊涂了。

2 个答案:

答案 0 :(得分:2)

使用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添加到类路径

答案 1 :(得分:0)

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