将CSV直接加载到对象集合中<;t>;通过Java流API
是否可以通过流API执行此操作 员工列表直接从CSV导入列表集合?tl;博士 使用CSV实用程序,例如,可以将每行传入数据传递给您编写的解析方法,并将生成的将CSV直接加载到对象集合中<;t>;通过Java流API,java,java-stream,Java,Java Stream,是否可以通过流API执行此操作 员工列表直接从CSV导入列表集合?tl;博士 使用CSV实用程序,例如,可以将每行传入数据传递给您编写的解析方法,并将生成的Employee对象收集到列表中 Iterable < CSVRecord > iterable = CSVFormat.RFC4180.withFirstRecordAsHeader().parse( reader ); employees = StreamSupport .str
Employee
对象收集到列表中
Iterable < CSVRecord > iterable = CSVFormat.RFC4180.withFirstRecordAsHeader().parse( reader );
employees =
StreamSupport
.stream( iterable.spliterator() , false )
.map( ( CSVRecord csvRecord ) -> Employee.parse( csvRecord ) )
.collect( Collectors.toList() )
;
细节
是的,您可以从CSV文件加载列表
首先,获取CSV解析实用程序,例如https://commons.apache.org/proper/commons-csv/. 您可以在Java生态系统中选择各种这样的工具
然后使用解析CSV输入的工厂方法定义一个Employee
类。在Apache Commons CSV的情况下,这将是一个CSVRecord
对象
UUID id = UUID.fromString( csvRecord.get( "id" ) ) ;
String name = csvRecord.get( "name" ) ;
return new Employee( id , name ) ;
Employee
类的重要parse
方法
// Parsing from Apache Commons CSV record
static public Employee parse ( CSVRecord csvRecord )
{
UUID id = UUID.fromString( Objects.requireNonNull( csvRecord.get( "id" ) ) );
String name = Objects.requireNonNull( csvRecord.get( "name" ) );
Employee employee = new Employee( id , name );
Objects.requireNonNull( employee );
return employee;
}
整个Employee
类源代码
package work.basil.example;
import org.apache.commons.csv.CSVRecord;
import java.util.Objects;
import java.util.UUID;
public class Employee
{
// Member fields.
private UUID id;
private String name;
// Constructor.
public Employee ( UUID id , String name )
{
this.id = Objects.requireNonNull( id );
this.name = Objects.requireNonNull( name );
if ( this.name.isBlank() ) { throw new IllegalArgumentException(); }
}
// Parsing from Apache Commons CSV record
static public Employee parse ( CSVRecord csvRecord )
{
UUID id = UUID.fromString( Objects.requireNonNull( csvRecord.get( "id" ) ) );
String name = Objects.requireNonNull( csvRecord.get( "name" ) );
Employee employee = new Employee( id , name );
Objects.requireNonNull( employee );
return employee;
}
// Object overrides.
@Override
public String toString ( )
{
return "Employee{ " +
"id=" + id +
" | name='" + name + '\'' +
" }";
}
@Override
public boolean equals ( Object o )
{
if ( this == o ) return true;
if ( o == null || getClass() != o.getClass() ) return false;
Employee employee = ( Employee ) o;
return getId().equals( employee.getId() );
}
@Override
public int hashCode ( )
{
return Objects.hash( getId() );
}
// Getters.
public UUID getId ( ) { return this.id; }
public String getName ( ) { return this.name; }
}
下面是一个使用工厂方法从CSV文件生成员工记录的列表的演示。这里的main
方法首先创建一个文件。请注意,第一行是标题行,声明了每列的名称。我们在解析代码中使用该名称
id,name
ac4f0541-4f39-4b8a-a49b-5e88405da503,爱丽丝
ca4a3950-e7a1-4521-993f-1d4c78ecda8c,鲍勃
67ef39f8-688f-4795-8b41-76d972cad888,卡罗尔
然后我们读取新创建的文件,Apache Commons CSV将每一行解析为CSVRecord
,并将其传递给静态方法Employee.parse
。我们得到一份员工
记录
在我们使用ApacheCommonsCSV的例子中,我们得到了CSVRecord
对象的Iterable
。我们将其转换为问题中讨论的用法
演示代码的核心
List < Employee > employees = List.of(); // Default to empty non-modifiable list.
Path path = Paths.get( "/Users/basilbourque/csv.txt" );
try (
Reader reader = Files.newBufferedReader( path , StandardCharsets.UTF_8 ) ;
)
{
Iterable < CSVRecord > iterable = CSVFormat.RFC4180.withFirstRecordAsHeader().parse( reader );
employees =
StreamSupport
.stream( iterable.spliterator() , false )
.map( ( CSVRecord csvRecord ) -> Employee.parse( csvRecord ) )
.collect( Collectors.toList() )
;
}
catch ( IOException e )
{
e.printStackTrace();
}
package work.basil.example;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVPrinter;
import org.apache.commons.csv.CSVRecord;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.Duration;
import java.time.Instant;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
public class EmployeeDemo
{
public static void main ( String[] args )
{
EmployeeDemo app = new EmployeeDemo();
app.write();
app.read();
}
private void write ( )
{
Path path = Paths.get( "/Users/basilbourque/csv.txt" );
try (
Writer writer = Files.newBufferedWriter( path , StandardCharsets.UTF_8 ) ;
CSVPrinter printer = new CSVPrinter( writer , CSVFormat.RFC4180 ) ;
)
{
printer.printRecord( "id" , "name" );
printer.printRecord( UUID.randomUUID() , "Alice" );
printer.printRecord( UUID.randomUUID() , "Bob" );
printer.printRecord( UUID.randomUUID() , "Carol" );
}
catch ( IOException ex )
{
ex.printStackTrace();
}
}
private void read ( )
{
List < Employee > employees = List.of(); // Default to empty non-modifiable list.
Path path = Paths.get( "/Users/basilbourque/csv.txt" );
try (
Reader reader = Files.newBufferedReader( path , StandardCharsets.UTF_8 ) ;
)
{
Iterable < CSVRecord > iterable = CSVFormat.RFC4180.withFirstRecordAsHeader().parse( reader );
employees =
StreamSupport
.stream( iterable.spliterator() , false )
.map( ( CSVRecord csvRecord ) -> Employee.parse( csvRecord ) )
.collect( Collectors.toList() )
;
}
catch ( IOException e )
{
e.printStackTrace();
}
System.out.println( "employees = " + employees );
}
}
Listemployees=List.of();//默认为空的不可修改列表。
Path Path=Path.get(“/Users/basilbourque/csv.txt”);
试一试(
Reader Reader=Files.newbuffereder(路径,StandardCharsets.UTF_8);
)
{
IterableIterable=CSVFormat.RFC4180.withFirstRecordAsHeader().parse(reader);
雇员=
河道支护
.stream(iterable.spliterator(),false)
.map((CSVRecord CSVRecord)->Employee.parse(CSVRecord))
.collect(收集器.toList())
;
}
捕获(IOE异常)
{
e、 printStackTrace();
}
整个演示代码
List < Employee > employees = List.of(); // Default to empty non-modifiable list.
Path path = Paths.get( "/Users/basilbourque/csv.txt" );
try (
Reader reader = Files.newBufferedReader( path , StandardCharsets.UTF_8 ) ;
)
{
Iterable < CSVRecord > iterable = CSVFormat.RFC4180.withFirstRecordAsHeader().parse( reader );
employees =
StreamSupport
.stream( iterable.spliterator() , false )
.map( ( CSVRecord csvRecord ) -> Employee.parse( csvRecord ) )
.collect( Collectors.toList() )
;
}
catch ( IOException e )
{
e.printStackTrace();
}
package work.basil.example;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVPrinter;
import org.apache.commons.csv.CSVRecord;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.Duration;
import java.time.Instant;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
public class EmployeeDemo
{
public static void main ( String[] args )
{
EmployeeDemo app = new EmployeeDemo();
app.write();
app.read();
}
private void write ( )
{
Path path = Paths.get( "/Users/basilbourque/csv.txt" );
try (
Writer writer = Files.newBufferedWriter( path , StandardCharsets.UTF_8 ) ;
CSVPrinter printer = new CSVPrinter( writer , CSVFormat.RFC4180 ) ;
)
{
printer.printRecord( "id" , "name" );
printer.printRecord( UUID.randomUUID() , "Alice" );
printer.printRecord( UUID.randomUUID() , "Bob" );
printer.printRecord( UUID.randomUUID() , "Carol" );
}
catch ( IOException ex )
{
ex.printStackTrace();
}
}
private void read ( )
{
List < Employee > employees = List.of(); // Default to empty non-modifiable list.
Path path = Paths.get( "/Users/basilbourque/csv.txt" );
try (
Reader reader = Files.newBufferedReader( path , StandardCharsets.UTF_8 ) ;
)
{
Iterable < CSVRecord > iterable = CSVFormat.RFC4180.withFirstRecordAsHeader().parse( reader );
employees =
StreamSupport
.stream( iterable.spliterator() , false )
.map( ( CSVRecord csvRecord ) -> Employee.parse( csvRecord ) )
.collect( Collectors.toList() )
;
}
catch ( IOException e )
{
e.printStackTrace();
}
System.out.println( "employees = " + employees );
}
}
package work.basil.example;
导入org.apache.commons.csv.CSVFormat;
导入org.apache.commons.csv.CSVParser;
导入org.apache.commons.csv.CSVPrinter;
导入org.apache.commons.csv.CSVRecord;
导入java.io.*;
导入java.nio.charset.StandardCharset;
导入java.nio.file.Files;
导入java.nio.file.Path;
导入java.nio.file.path;
导入java.time.Duration;
导入java.time.Instant;
导入java.util.List;
导入java.util.UUID;
导入java.util.stream.collector;
导入java.util.stream.StreamSupport;
公共类雇员emo
{
公共静态void main(字符串[]args)
{
EmployeeDemo app=新EmployeeDemo();
app.write();
app.read();
}
私有无效写入()
{
Path Path=Path.get(“/Users/basilbourque/csv.txt”);
试一试(
Writer Writer=Files.newBufferedWriter(路径,StandardCharsets.UTF_8);
CSVPrinter打印机=新的CSVPrinter(writer,CSVFormat.RFC4180);
)
{
打印机。打印记录(“id”、“名称”);
printer.printRecord(UUID.randomUUID(),“Alice”);
printer.printRecord(UUID.randomUUID(),“Bob”);
printer.printRecord(UUID.randomUUID(),“Carol”);
}
捕获(IOEX异常)
{
例如printStackTrace();
}
}
私有无效读取()
{
Listemployees=List.of();//默认为空的不可修改列表。
Path Path=Path.get(“/Users/basilbourque/csv.txt”);
试一试(
Reader Reader=Files.newbuffereder(路径,StandardCharsets.UTF_8);
)
{
IterableIterable=CSVFormat.RFC4180.withFirstRecordAsHeader().parse(reader);
雇员=
河道支护
.stream(iterable.spliterator(),false)
.map((CSVRecord CSVRecord)->Employee.parse(CSVRecord))
.collect(收集器.toList())
;
}
捕获(IOE异常)
{
e、 printStackTrace();
}
System.out.println(“employees=“+employees”);
}
}
跑步的时候
雇员=[雇员{id=ac4f0541-4f39-4b8a-a49b-5e88405da503 | name='Alice'},雇员{id=ca4a3950-e7a1-4521-993f-1d4c78ecda8c | name='Bob'},雇员{id=67ef39f8-688f-4795-8b41-76d972cad888 | name='Carol'}]
tl;博士
使用CSV实用程序,例如,可以将每行传入数据传递给您编写的解析方法,并将生成的Employee
对象收集到列表中
Iterable < CSVRecord > iterable = CSVFormat.RFC4180.withFirstRecordAsHeader().parse( reader );
employees =
StreamSupport
.stream( iterable.spliterator() , false )
.map( ( CSVRecord csvRecord ) -> Employee.parse( csvRecord ) )
.collect( Collectors.toList() )
;
细节
是的,您可以从CSV文件加载列表
首先,获取CSV解析实用程序,例如https://commons.apache.org/proper/commons-csv/. 您可以在Java生态系统中选择各种这样的工具
然后使用解析CSV输入的工厂方法定义一个Employee
类。在Apache Commons CSV的情况下,这将是一个CSVRecord
对象
UUID id = UUID.fromString( csvRecord.get( "id" ) ) ;
String name = csvRecord.get( "name" ) ;
return new Employee( id , name ) ;
Employee
类的重要parse
方法
// Parsing from Apache Commons CSV record
static public Employee parse ( CSVRecord csvRecord )
{
UUID id = UUID.fromString( Objects.requireNonNull( csvRecord.get( "id" ) ) );
String name = Objects.requireNonNull( csvRecord.get( "name" ) );
Employee employee = new Employee( id , name );
Objects.requireNonNull( employee );
return employee;
}
整个Employee
类源代码
package work.basil.example;
import org.apache.commons.csv.CSVRecord;
import java.util.Objects;
import java.util.UUID;
public class Employee
{
// Member fields.
private UUID id;
private String name;
// Constructor.
public Employee ( UUID id , String name )
{
this.id = Objects.requireNonNull( id );
this.name = Objects.requireNonNull( name );
if ( this.name.isBlank() ) { throw new IllegalArgumentException(); }
}
// Parsing from Apache Commons CSV record
static public Employee parse ( CSVRecord csvRecord )
{
UUID id = UUID.fromString( Objects.requireNonNull( csvRecord.get( "id" ) ) );
String name = Objects.requireNonNull( csvRecord.get( "name" ) );
Employee employee = new Employee( id , name );
Objects.requireNonNull( employee );
return employee;
}
// Object overrides.
@Override
public String toString ( )
{
return "Employee{ " +
"id=" + id +
" | name='" + name + '\'' +
" }";
}
@Override
public boolean equals ( Object o )
{
if ( this == o ) return true;
if ( o == null || getClass() != o.getClass() ) return false;
Employee employee = ( Employee ) o;
return getId().equals( employee.getId() );
}
@Override
public int hashCode ( )
{
return Objects.hash( getId() );
}
// Getters.
public UUID getId ( ) { return this.id; }
public String getName ( ) { return this.name; }
}
下面是一个使用工厂方法从CSV文件生成员工记录的列表的演示。这里的main
方法首先创建一个文件。注意第一个