Java CSV写入

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

我目前正在尝试将数据写入excel以生成报告。我可以将数据写入csv文件,但是它不会以我想要的顺序在excel中显示。我需要在每列的最佳和最差适合度下打印数据,而不是在平均值下打印所有数据。以下是相关代码,如有任何帮助,将不胜感激:

    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变体,因此您可能会发现它特别有用

您的数据,在本例中读写

Commons CSV库可以读取第一行作为标题名

下面是一个完整的示例应用程序,位于单个
.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
。我们将每一行添加到一个集合、一个列表列表、一个
列表

然后我们将导入的数据写入另一个文件。每个写入的文件都是name
WorstBest_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();
}
}
}

谢谢大家,现在一切都好了,非常感谢大家的帮助。那么请删除您的问题?我马上删除您!