我是java的新手但是,我似乎无法想出这个。我有一个CSV文件,格式如下:
String1,String2
String1,String2
String1,String2
String1,String2
每一行都是成对的。第二行是新记录,与第三行相同。在真实的单词中,CSV文件的大小会有所变化,有时它会是3条记录,或4条甚至10条。
我的问题是如何将值读入数组并动态调整大小?我想,首先我们必须解析csv文件,获取记录/元素的数量,然后根据该大小创建数组,然后再次通过CSV并将其存储在数组中。
我不知道如何做到这一点。
任何帮助都将不胜感激。
答案 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)
List
或Set
进行自动扩展。定义一个类,以保存从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 库在读取和编写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'}]