java CSV文件到数组

时间:2014-10-09 14:03:49

标签: java arrays parsing

我是java的新手但是,我似乎无法想出这个。我有一个CSV文件,格式如下:

String1,String2
String1,String2
String1,String2
String1,String2

每一行都是成对的。第二行是新记录,与第三行相同。在真实的单词中,CSV文件的大小会有所变化,有时它会是3条记录,或4条甚至10条。

我的问题是如何将值读入数组并动态调整大小?我想,首先我们必须解析csv文件,获取记录/元素的数量,然后根据该大小创建数组,然后再次通过CSV并将其存储在数组中。

我不知道如何做到这一点。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:2)

您可以使用ArrayList而不是Array。 ArrayList是动态数组。离。

Scanner scan = new Scanner(new File("yourfile"));
ArrayList<String[]> records = new ArrayList<String[]>();
String[] record = new String[2];
while(scan.hasNext())
{
    record = scan.nextLine().split(",");
    records.add(record);
}
//now records has your records.
//here is a way to loop through the records (process)
    for(String[] temp : records)
    {
        for(String temp1 : temp)
        {
            System.out.print(temp1 + " ");
        }
        System.out.print("\n");
    }

只需替换&#34; yourfile&#34;使用文件的绝对路径。

你可以这样做。

如果你不喜欢第一个例子,那么处理数据的循环更传统:

    for(int i = 0; i < records.size(); i++)
    {
        for(int j = 0; j < records.get(i).length; j++)
        {
            System.out.print(records.get(i)[j] + " ");
        }
        System.out.print("\n");
    }

两个for循环都在做同样的事情。

答案 1 :(得分:1)

您可以使用开源库uniVocity-parsers简单地将CSV读取为2行中的2维数组。

请参考以下代码作为示例:

public static void main(String[] args) throws FileNotFoundException {

    /**
     * ---------------------------------------
     * Read CSV rows into 2-dimensional array
     * ---------------------------------------
     */

    // 1st, creates a CSV parser with the configs
    CsvParser parser = new CsvParser(new CsvParserSettings());

    // 2nd, parses all rows from the CSV file into a 2-dimensional array
    List<String[]> resolvedData = parser.parseAll(new FileReader("/examples/example.csv"));

    // 3rd, process the 2-dimensional array with business logic
    // ......
}

答案 2 :(得分:0)

tl; dr

  • 添加项目时,请使用Java集合而不是数组(尤其是ListSet进行自动扩展。
  • 定义一个类来保存从CSV读取的数据,为每个读取的行实例化一个对象。
  • 使用 Apache Commons CSV 库帮助您完成读/写CSV文件的工作。

用于保存数据的类

定义一个类,以保存从CSV中读取的每一行的数据。让我们使用具有特定名称和姓氏的Person类,比“问题”中的示例更具体。

package work.basil.example;

public class Person {
    public String givenName, surname;

    public Person ( String givenName , String surname ) {
        this.givenName = givenName;
        this.surname = surname;
    }

    @Override
    public String toString ( ) {
        return "Person{ " +
                "givenName='" + givenName + '\'' +
                " | surname='" + surname + '\'' +
                " }";
    }
}

集合,而不是数组

使用Java Collections通常比单纯使用数组要好。集合更灵活,功能更强大。参见Oracle Tutorial

在这里,我们将使用List界面收集从从CSV文件读取的数据实例化的每个Person对象。我们使用List的具体ArrayList实现,该实现在后台使用数组。与您的问题相关的重要部分是,您可以将对象添加到List 而无需担心调整大小List实现负责任何所需的调整大小。

如果您碰巧知道要填充的列表的大小,则可以在创建List时提供可选的初始容量作为提示。

Apache Commons CSV

Apache Commons CSV 库在读取和编写CSV和制表符分隔格式的几种变体方面做得很好。

示例应用

这是一个示例应用程序,位于单个PersoIo.java文件中。 Io是输入输出的缩写。

示例数据。

GivenName,Surname
Alice,Albert
Bob,Babin
Charlie,Comtois
Darlene,Deschamps

源代码。

package work.basil.example;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVRecord;

import java.io.BufferedReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

public class PersonIo {
    public static void main ( String[] args ) {
        PersonIo app = new PersonIo();
        app.doIt();
    }

    private void doIt ( ) {
        Path path = Paths.get( "/Users/basilbourque/people.csv" );
        List < Person > people = this.read( path );
        System.out.println( "People: \n" + people );
    }

    private List < Person > read ( final Path path ) {
        Objects.requireNonNull( path );
        if ( Files.notExists( path ) ) {
            System.out.println( "ERROR - no file found for path: " + path + ". Message # de1f0be7-901f-4b57-85ae-3eecac66c8f6." );
        }

        List < Person > people = List.of(); // Default to empty list.
        try {
            // Hold data read from file.
            int initialCapacity = ( int ) Files.lines( path ).count();
            people = new ArrayList <>( initialCapacity );

            // Read CSV file.
            BufferedReader reader = Files.newBufferedReader( path );
            Iterable < CSVRecord > records = CSVFormat.RFC4180.withFirstRecordAsHeader().parse( reader );
            for ( CSVRecord record : records ) {
                // GivenName,Surname
                // Alice,Albert
                // Bob,Babin
                // Charlie,Comtois
                // Darlene,Deschamps
                String givenName = record.get( "GivenName" );
                String surname = record.get( "Surname" );

                // Use read data to instantiate.
                Person p = new Person( givenName , surname );

                // Collect
                people.add( p ); // For real work, you would define a class to hold these values.
            }

        } catch ( IOException e ) {
            e.printStackTrace();
        }
        return people;
    }


}

运行时。

  

人们:

     

[人员{namedName ='Alice'|人名=“阿尔伯特”},人物{给定名字=“鲍勃” |姓氏=“巴宾”},人物{给定名称=“查理” |姓,“姓氏”,“ Comtois”},{ surname ='Deschamps'}]