Java CSV写入
我目前正在尝试将数据写入excel以生成报告。我可以将数据写入csv文件,但是它不会以我想要的顺序在excel中显示。我需要在每列的最佳和最差适合度下打印数据,而不是在平均值下打印所有数据。以下是相关代码,如有任何帮助,将不胜感激:Java CSV写入,java,excel,csv,Java,Excel,Csv,我目前正在尝试将数据写入excel以生成报告。我可以将数据写入csv文件,但是它不会以我想要的顺序在excel中显示。我需要在每列的最佳和最差适合度下打印数据,而不是在平均值下打印所有数据。以下是相关代码,如有任何帮助,将不胜感激: String [] Fitness = "Average fitness#Worst fitness #Best Fitness".split("#"); writer.writeNext(Fitness); //takes data fr
String [] Fitness = "Average fitness#Worst fitness #Best Fitness".split("#");
writer.writeNext(Fitness);
//takes data from average fitness and stores as an int
int aFit = myPop.individuals[25].getFitness();
//converts int to string
String aFit1 = Integer.toString(aFit);
//converts string to string array
String aFit2 [] = aFit1.split(" ");
//writes to csv
writer.writeNext(aFit2);
//String [] nextCol = "#".split("#");
int wFit = myPop.individuals[49].getFitness();
String wFit1 = Integer.toString(wFit);
String wFit2 [] = wFit1.split(" ");
writer.writeNext(wFit2);
int bFit = myPop.individuals[1].getFitness();
String bFit1 = Integer.toString(bFit);
String bFit2 [] = bFit1.split(" ");
writer.writeNext(bFit2);
来自
public void writeNext(字符串[]下一行)
-将下一行写入文件
要提供的字符串数组是
一个字符串数组,每个逗号分隔的元素作为一个单独的条目
您要写3行而不是1行,并且每行都包含一个带有单个条目的数组
writer.writeNext(aFit2);
writer.writeNext(wFit2);
writer.writeNext(bFit2);
解决方案:
创建一个包含所有3个条目(列值)的数组,并在一行中写入一次。我认为您应该在每行数据中调用一次“writeNext”方法:
String [] Fitness = "Average fitness#Worst fitness #Best Fitness".split("#");
writer.writeNext(Fitness);
int aFit = myPop.individuals[25].getFitness();
String aFit1 = Integer.toString(aFit);
int wFit = myPop.individuals[49].getFitness();
String wFit1 = Integer.toString(wFit);
int bFit = myPop.individuals[1].getFitness();
String bFit1 = Integer.toString(bFit);
writer.writeNext(new String[]{aFit1, wFit1, bFit1});
我假设您正在使用CSVWriter写入CSV文件。请确保在一个问题中尽可能多地提及细节,这会使其他人更容易理解 从CSVWriter的文档中可以看到: void writeNext(字符串[]下一行) 将下一行写入文件 writeNext方法实际上将数组写入文件的一行。从您的代码:
writer.writeNext(aFit2);
writer.writeNext(wFit2);
writer.writeNext(bFit2);
因此,不要这样做`String aFit2[]=aFit1.split(“”);
创建一个值数组,然后将该数组传递给writeNext
作为一个例子,您可以考虑自己传递列名数组的例子,这些列名以单行形式写成:
writer.writeNext(Fitness);
Apache Commons CSV
这里是相同的解决方案,但使用库。此库专门支持CSV格式的Microsoft Excel变体,因此您可能会发现它特别有用
.java
文件中。首先,应用程序读取现有的WorstBest.csv
数据文件:
平均、最差、最佳
10,5,15
11,5,16
10,6,16
11,6,15
10,5,16
10,5,16
10,4,16
每行表示为三个String
对象的List
,一个List
。我们将每一行添加到一个集合、一个列表列表、一个列表
然后我们将导入的数据写入另一个文件。每个写入的文件都是nameWorstBest_xxx.csv
,其中xxx
是UTC的当前时刻
package com.basilbourque.example;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.apache.commons.csv.CSVRecord;
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class WorstBest {
public static void main ( String[] args ) {
WorstBest app = new WorstBest();
List < List < String > > data = app.read();
app.write( data );
}
private List < List < String > > read ( ) {
List < List < String > > listOfListsOfStrings = List.of();
try {
// Locate file to import and parse.
Path path = Paths.get( "/Users/basilbourque/WorstBest.csv" );
if ( Files.notExists( path ) ) {
System.out.println( "ERROR - no file found for path: " + path + ". Message # 3cf416de-c33b-4c39-8507-5fbb72e113f2." );
}
// Hold data read from file.
int initialCapacity = ( int ) Files.lines( path ).count();
listOfListsOfStrings = new ArrayList <>( initialCapacity );
// Read CSV file.
BufferedReader reader = Files.newBufferedReader( path );
Iterable < CSVRecord > records = CSVFormat.RFC4180.withFirstRecordAsHeader().parse( reader );
for ( CSVRecord record : records ) {
// Average,Worst,Best
// 10,5,15
// 11,5,16
String average = record.get( "Average" ); // Must use annoying zero-based index counting.
String worst = record.get( "Worst" );
String best = record.get( "Best" );
// Collect
listOfListsOfStrings.add( List.of( average , worst , best ) ); // For real work, you would define a class to hold these values.
}
} catch ( IOException e ) {
e.printStackTrace();
}
return listOfListsOfStrings;
}
private void write ( List < List < String > > listOfListsOfStrings ) {
Objects.requireNonNull( listOfListsOfStrings );
// Determine file in which to write data.
String when = Instant.now().truncatedTo( ChronoUnit.SECONDS ).toString().replace( ":" , "•" ); // Colons are forbidden in names by some file systems such as HFS+.
Path path = Paths.get( "/Users/basilbourque/WorstBest_" + when + ".csv" );
// Loop collection of data (a list of lists of strings).
try ( final CSVPrinter printer = CSVFormat.EXCEL.withHeader( "Average" , "Worst" , "Best" ).print( path , StandardCharsets.UTF_8 ) ; ) {
for ( List < String > list : listOfListsOfStrings ) {
printer.printRecord( list.get( 1 - 1 ) , list.get( 2 - 1 ) , list.get( 3 - 1 ) ); // Annoying zero-based index counting.
}
} catch ( IOException e ) {
e.printStackTrace();
}
}
}
package com.basilbourque.example;
导入org.apache.commons.csv.CSVFormat;
导入org.apache.commons.csv.CSVPrinter;
导入org.apache.commons.csv.CSVRecord;
导入java.io.BufferedReader;
导入java.io.IOException;
导入java.nio.charset.StandardCharset;
导入java.nio.file.Files;
导入java.nio.file.Path;
导入java.nio.file.path;
导入java.time.Instant;
导入java.time.temporal.ChronoUnit;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Objects;
公共类最佳{
公共静态void main(字符串[]args){
WorstBest应用程序=新的WorstBest();
List>data=app.read();
应用程序写入(数据);
}
私有列表>读取(){
List>listOfListsOfStrings=List.of();
试一试{
//找到要导入和分析的文件。
Path Path=Path.get(“/Users/basilbourque/WorstBest.csv”);
if(Files.notExists(path)){
System.out.println(“错误-未找到路径“+path+”的文件。消息#3cf416de-c33b-4c39-8507-5fbb72e113f2”);
}
//保存从文件读取的数据。
int initialCapacity=(int)Files.lines(path.count();
listOfListsOfStrings=新的ArrayList(初始容量);
//读取CSV文件。
BufferedReader reader=Files.newBufferedReader(路径);
Iterablerecords=CSVFormat.RFC4180.withFirstRecordAsHeader().parse(reader);
用于(CSVRecord记录:记录){
//一般、最差、最好
// 10,5,15
// 11,5,16
String average=record.get(“average”);//必须使用恼人的基于零的索引计数。
字符串最差=记录。获取(“最差”);
String best=record.get(“最佳”);
//收集
listOfListsOfStrings.add(List.of(average,best,best));//对于实际工作,您需要定义一个类来保存这些值。
}
}捕获(IOE异常){
e、 printStackTrace();
}
返回ListOfListOfString;
}
私有无效写入(List>listOfListsOfStrings){
Objects.requirennull(列表字符串列表);
//确定要在其中写入数据的文件。
String when=Instant.now().truncatedTo(ChronoUnit.SECONDS).toString().replace(“:”,“•”;//某些文件系统(如HFS+)在名称中禁止冒号。
Path Path=Paths.get(“/Users/basilbourque/WorstBest_”+when+.csv”);
//循环数据集合(字符串列表的列表)。
try(最终CSVPrinter打印机=CSVFormat.EXCEL.withHeader(“平均”、“最差”、“最佳”)。打印(路径,StandardCharsets.utf8);){
对于(列表List:listofListsofString){
printer.printRecord(list.get(1-1)、list.get(2-1)、list.get(3-1));//讨厌的从零开始的索引计数。
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
谢谢大家,现在一切都好了,非常感谢大家的帮助。那么请删除您的问题?我马上删除您!