当前位置: 首页 > 面试题库 >

将csv文件读入数组

夏弘文
2023-03-14
问题内容

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

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

    }

}

问题答案:

尽管使用@ 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)String[]数组转换List为与我们的List<List<...>>类型兼容的数组。这使您的线具有可变的长度。

  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

希望这可以帮助 :)



 类似资料:
  • 问题内容: 我想打开一个新的文本文件,然后将numpy数组保存到该文件。我写了这段代码: 我收到此错误: 有人知道怎么了吗? 另外,我在终端中找到了一个名为file_2的空文件,但是里面没有任何内容。 编辑:我正在使用Python3.4 问题答案: 看来您正在使用Python3。因此,请以二进制模式()而非文本模式()打开文件: 另外,关闭文件句柄,以确保将所有内容都写入磁盘。您可以使用-stat

  • 我在pandas中有一个数据帧,我想把它写到CSV文件中。我使用的是: 并得到错误: 有没有什么方法可以很容易地解决这个问题(例如,我的数据帧中有unicode字符)?还有,有没有一种方法可以使用“to-tab”方法(我认为不存在)写入以制表符分隔的文件,而不是CSV?

  • 我正在使用Spark 2.3,我需要将Spark数据帧保存到csv文件中,我正在寻找更好的方法。。查看相关/类似的问题,我发现了这个问题,但我需要一个更具体的: 如果DataFrame太大,如何避免使用Pandas?因为我使用了函数(下面的代码),它产生了: 内存不足错误(无法分配内存)。 使用文件I/O直接写入csv是更好的方法吗?它可以保留分隔符吗? 使用df。聚结(1)。写选项(“标题”、“

  • 问题内容: 将结构转储到提供的csv文件中的惯用golang方法是什么?我在一个func里面,我的结构作为接口{}传递: 为什么要使用界面{}?-从JSON读取数据,可能会返回一些不同的结构,因此尝试编写足够通用的函数。 我的类型的一个例子: 问题答案: 如果您使用具体类型,将会容易得多。您可能想要使用该软件包,这是一个相关示例;https://golang.org/pkg/encoding/cs

  • 问题内容: 我正在寻找使用导入文件到SQL Server的帮助,我有几个基本问​​题。 问题: CSV文件数据的中间(例如:描述)之间可能有(逗号),那么如何进行导入处理这些数据? 如果客户端从Excel创建CSV,则用逗号括起来的数据(用双引号引起来)(如下例所示),那么导入如何处理呢? 我们如何跟踪某些行是否有不良数据,哪些导入会跳过?(导入会跳过不可导入的行) 这是带有标题的示例CSV: 和

  • 我正在寻找有关使用将文件导入SQL Server的帮助,我没有什么基本问题。 下面是带有头部的示例CSV: 和要导入的SQL语句: