将 csv 文件读入数组

新手上路,请多包涵

我正在尝试将 csv 文件“read_ex.csv”读入数组。我在 web/stackoverflow 上无休止地搜索以找到一种将文件读入数组的方法。我能做的最好的事情是以流方式读取它,但由于文件大小可变,我无法将它存储在数组中。我相信 ArrayList 是一种处理可变大小数组的方法,但我不知道如何使用它。本质上,我希望能够在 while 循环完成后访问字符串数组“值”。

 import java.util.Scanner;
import java.io.FileNotFoundException;
import java.io.File;

public class sortarray {
     public static void main (String []agrs){
         String fileName= "read_ex.csv";
         File file= new File(fileName);

         try{
             Scanner inputStream= new Scanner(file);
             while(inputStream.hasNext()){
             String data= inputStream.next();
             String[] values = data.split(",");
             System.out.println(values[1]);
             }
             inputStream.close();
          }catch (FileNotFoundException e) {
             e.printStackTrace();
     }
     //This prints out the working directory
     System.out.println("Present Project Directory : "+ System.getProperty("user.dir"));

    }

}

原文由 mikeL 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 635
2 个回答

尽管使用 @Minjun.Y 提到的 Apache CSV 库非常好,但我尝试提供一个更接近您的代码并且可能更容易让您遵循的解决方案:

 import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class CsvParser {

    public static void main(String[] args) {
        String fileName= "read_ex.csv";
        File file= new File(fileName);

        // this gives you a 2-dimensional array of strings
        List<List<String>> lines = new ArrayList<>();
        Scanner inputStream;

        try{
            inputStream = new Scanner(file);

            while(inputStream.hasNext()){
                String line= inputStream.next();
                String[] values = line.split(",");
                // this adds the currently parsed line to the 2-dimensional string array
                lines.add(Arrays.asList(values));
            }

            inputStream.close();
        }catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        // the following code lets you iterate through the 2-dimensional array
        int lineNo = 1;
        for(List<String> line: lines) {
            int columnNo = 1;
            for (String value: line) {
                System.out.println("Line " + lineNo + " Column " + columnNo + ": " + value);
                columnNo++;
            }
            lineNo++;
        }
    }

}

让我们逐步了解它:

  1. 我又添加了 3 个导入: ArrayListArraysList - 你很快就会看到它们的优点。它们都取自 java.util 库,这是一个标准库,每个 JDK 都可用。

  2. Java 中的每个类名都以大写字母开头(按照惯例——它也会以小写字母构建,但你应该习惯这个惯例)——我在你的代码中“修复”了这个。

  3. 我添加了一个二维数组 List<List<String>> lines = new ArrayList<>() 。这乍一看可能有点令人困惑,但这意味着我们创建了一个变量 lines 来保存我们的解析结果。 List<String> 语法意味着,我们有一个 通用类型 List 有一个类型参数 String 换句话说:一个字符串列表。整个 List<List<String>> 意味着我们有一个字符串列表列表,一个二维字符串数组。

  4. 使用 lines.add(Arrays.asList(values)) 在你的 while 循环中,我们可以将你解析的行添加到这个二维数组中。 Arrays.asList(values) transforms the String[] array into a List as we need it to be compatible to our List<List<...>> type.这允许您的行具有可变长度。

  5. 我添加的最后几行只是打印二维数组的内容,并且应该为您提供一个很好的示例,说明如何访问该数组中的值。如果您需要有关此构造的更多帮助,请查看 foreach 循环文档

将其作为输入文件 ( read_ex.csv ):

 value_1-1,value_1-2,value_1-3,value_1-4
value_2-1,value_2-2,value_2-3,value_2-4
value_3-1,value_3-2,value_3-3,value_3-4
value_4-1,value_4-2,value_4-3,value_4-4
value_5-1,value_5-2,value_5-3,value_5-4

该程序将打印以下输出:

 Line 1 Column 1: value_1-1
Line 1 Column 2: value_1-2
Line 1 Column 3: value_1-3
Line 1 Column 4: value_1-4
Line 2 Column 1: value_2-1
Line 2 Column 2: value_2-2
Line 2 Column 3: value_2-3
Line 2 Column 4: value_2-4
Line 3 Column 1: value_3-1
Line 3 Column 2: value_3-2
Line 3 Column 3: value_3-3
Line 3 Column 4: value_3-4
Line 4 Column 1: value_4-1
Line 4 Column 2: value_4-2
Line 4 Column 3: value_4-3
Line 4 Column 4: value_4-4
Line 5 Column 1: value_5-1
Line 5 Column 2: value_5-2
Line 5 Column 3: value_5-3
Line 5 Column 4: value_5-4

希望这可以帮助 :)

原文由 Michael Lihs 发布,翻译遵循 CC BY-SA 3.0 许可协议

我是 Java 的新手,愿意接受任何将 csv 读入初学者可以理解的文件的方法。

这是 Apache CommonsApache Commons CSV 项目)为您提供的现有解决方案。请参阅 Apache Commons CSV 解析器指南

开箱即用,非常容易使用。

这是一个基本的工作流程:

  • 创建一个类,该类的字段与 csv 文件的列“匹配”。
  • csv 中的每一行都是该类的一个对象,其属性与 csv 中的字段相对应。使用该库获取每个字段并将其循环存储在您的对象中。
  • 在您的循环中,您将从 ArrayList 中的 csv 中读取的字段/属性存储对象
  • 循环结束后,您的 ArrayList 将具有与 csv 文件中的行“匹配”的元素。您可以自由访问列表中的任何行/元素。

如果您不熟悉 ListArrayList 如何在 Java 中工作,请参考几乎所有 Java 在线教程,包括 Oracle 教程

Stackoverflow 上搜索 数百篇关于使用 Commons CSV 的帖子。

原文由 Minjun Yu 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题