为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 JAVA 读取 CSV 文件

如何使用 JAVA 读取 CSV 文件

神不在的星期二 2023-09-27 21:31:32
我有一个问题,但我还没有找到任何解决方案。以下问题:我必须读取一个 CSV 文件,该文件必须如下所示:First Name,Second Name,Age,Lucas,Miller,17,Bob,Jefferson,55,Andrew,Washington,31,作业是用JAVA读取这个CSV文件并显示如下:First Name: LucasSecond Name: MillerAge: 17属性名称并不总是相同,因此也可能是:Street,Number,Postal Code,ID,Schoolstreet,93,20000,364236492,(“,”必须替换为“;”)此外,文件地址并不总是相同。我已经有了视图等。我只需要模型。感谢您的帮助。:))我在 Controller 中已经有一个 FileChooser 类,它返回一个 URI。
查看完整描述

2 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

如果您的 CSV 文件始终包含指示表列名称的标题行,那么只需捕获该行并将其拆分,以便将这些列名称放入字符串数组(或集合,或其他)中。该数组的长度决定了每个记录数据行预期可用的数据量。一旦你有了列名,事情就变得相对容易了。


如何获取 CSV 文件路径及其格式类型显然取决于您,但以下是如何执行手头任务的一般概念:


public static void readCsvToConsole(String csvFilePath, String csvDelimiter) {

    String line;                            // To hold each valid data line.

    String[] columnNames = new String[0];   // To hold Header names.

    int dataLineCount = 0;                  // Count the file lines.

    StringBuilder sb = new StringBuilder(); // Used to build the output String.

    String ls = System.lineSeparator();     // Use System Line Seperator for output.


    // 'Try With Resources' to auto-close the reader

    try (BufferedReader br = new BufferedReader(new FileReader(csvFilePath))) {

        while ((line = br.readLine()) != null) {

            // Skip Blank Lines (if any).

            if (line.trim().equals("")) {

                continue;

            }

            dataLineCount++;

            // Deal with the Header Line. Line 1 in most CSV files is the Header Line.

            if (dataLineCount == 1) {

                /* The Regular Expression used in the String#split()

                   method handles any delimiter/spacing situation.*/

                columnNames = line.split("\\s{0,}" + csvDelimiter + "\\s{0,}");

                continue;   // Don't process this line anymore. Continue loop.

            }

            // Split the file data line into its respective columnar slot.

            String[] lineParts = line.split("\\s{0,}" + csvDelimiter + "\\s{0,}");

            /* Iterate through the Column Names and buld a String

               using the column names and its' respective data along

               with a line break after each Column/Data line.     */

            for (int i = 0; i < columnNames.length; i++) {

                sb.append(columnNames[i]).append(": ").append(lineParts[i]).append(ls);

            }

            // Display the data record in Console.

            System.out.println(sb.toString());  

            /* Clear the StringBuilder object to prepare for 

               a new string creation.     */

            sb.delete(0, sb.capacity());        

        }

    }

    // Trap these Exceptions

    catch (FileNotFoundException ex) {

        System.err.println(ex.getMessage());

    }

    catch (IOException ex) {

        System.err.println(ex.getMessage());

    }

}

使用这种方法,您可以拥有 1 到数千个列,这并不重要(并不是说您在任何给定记录中都会有数千个数据列,但是嘿....您永远不知道...哈哈)。并使用此方法:


// Read CSV To Console Window.

readCsvToConsole("test.csv", ",");


查看完整回答
反对 回复 2023-09-27
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

如果始终有 3 个属性,我将读取 csv 的第一行并在具有三个字段的对象中设置值:attribute1、attribute2 和 attribute3。我将创建另一个类来保存三个值并读取之后的所有行,每次创建一个新实例并在数组列表中读取它们。要打印,我只需每次将属性类中的值与每组值一起打印即可。


查看完整回答
反对 回复 2023-09-27
  • 2 回答
  • 0 关注
  • 123 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信