2016-10-16 53 views
5

我完全不熟悉java(本周刚刚开始)。我正在尝试将csv文件“read_ex.csv”读入数组中。我已经在Web/satckoverflow上无休止地搜索以找到将文件读入数组的方法。我已经能够做的最好的是以流媒体的方式阅读它,但由于文件的大小不同,我无法将它存储在数组中。我相信ArrayList是一种处理可变大小数组的方法,但我不知道如何使用它。基本上我希望能够在while循环完成后访问字符串数组“值”。将一个csv文件读入一个数组

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

    }   

} 

正如我所说,我是新来的Java和沃尔德是开放的,它读取CSV成一个初学者可以理解文件的任何方法。

回答

11

虽然使用Apache CSV库由@ Minjun.Y提到的是完全没有问题的,我尽量提供一个解决方案,是更接近你的代码,也许您更轻松地遵循:

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. 我添加了2维阵列List<List<String>> lines = new ArrayList<>()。这可能看起来有点混乱在第一,但它的意思是,我们创建一个变量lines保存我们的分析结果。该List<String>语法意味着,我们有一个generic typeList具有类型参数String - 换句话说:字符串列表。整个List<List<String>>意味着我们有一个字符串列表,一个2维字符串数组列表。

  4. 随着lines.add(Arrays.asList(values))while循环中,我们可以添加您解析这个二维数组中的行。 Arrays.asList(values)变换String[]阵列成List,因为我们需要的是我们的List<List<...>>类型兼容。这使您的线路具有可变长度。

  5. 最后几行我加了简单地打印二维数组中的内容,并应让您了解如何访问此数组中的值一个很好的例子。如果您需要此构造的进一步帮助,请检查foreach loop documentation

鉴于此作为输入文件(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 

希望这有助于:)

+0

@Micheal Lihs,对于细节谢谢。你和我的问题以及其他几个人一样! – mikeL

+0

不客气!希望你喜欢Java :-) –

+0

我一直在寻找这样的东西:)谢谢你的回答 –

6

我是新来的Java和沃尔德是开放的,它读取CSV成一个初学者可以理解文件的任何方法。

这是您现有的解决方案,从Apache Commons,Apache Commons CSV项目。请参阅Apache Commons CSV parser guide

开箱即用非常容易。

这是一个基本的worfklow:

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

如果你不熟悉ListArrayList作品在Java中如何操作,请参阅几乎任何Java在线教程包括Oracle Tutorial

Search Stackoverflow数百篇关于使用Commons CSV的文章。

+0

感谢链接。在“Iterable records = CSVFormat.EXCEL.parse(in);”行中,我假定“CSVRecord”是类,但是指的是“CSVFormat.EXCEL.parse(in)”。 – mikeL

+0

@mikeL不要猜测,请阅读文档。 ['CSVFormat'](https://commons.apache.org/proper/commons-csv/archives/1.4/apidocs/index.html)的类文档解释了Commons CSV支持五种不同的格式。 ['EXCEL'](https://commons.apache.org/proper/commons-csv/archives/1.4/apidocs/org/apache/commons/csv/CSVFormat.html#EXCEL)是一个常量(预定义的)对象,用于由Microsoft Excel应用程序生成的CSV的特定风格。引用:Excel文件格式(使用逗号作为值分隔符)。请注意,Excel中使用的实际值分隔符是依赖于语言环境... –

相关问题