将Java列表字符串写入CSV文件

4

我有一些类似下面这样的数组字符串(注意每个选手后面都有空格,表示不同的行...):

["user1","track1","player1", "user1","track2","player2", "user1","track3","player3", ...] 

我希望将这个数组根据行数(空格)分成两部分(几乎相等)。例如,如果这个数组有40个空格,我需要将从第一行到一半(第20行)的行存储在一个文件中(我们称之为文件A),并将剩余的行放入文件B。我可以将ArrayList分成两部分,但是我无法以正确的方式将其写入CSV文件。
以下是我的代码:
public static void main(String[] args) throws java.lang.Exception { 
BufferedReader userlines = new BufferedReader(new FileReader("/..../usertrackplayer.csv"));       
FileWriter output = new FileWriter(new File("/.../output.csv"));

String uLine = null;    
ArrayList<String> list = new ArrayList<String>();
List<String> arrayList = new ArrayList<String>();
String currentUserId = null;        

while ((uLine = userlines.readLine()) != null) {

    String[] userData = uLine.split(",");
    String userId = userData[0];            
    if (userId.equals(currentUserId)) {
      // Do what ever we need while buffering same userId               
    }
    else{
        list.add(uLine);
        int division = (int) Math.ceil(list.size()/2);

        List<String> sublist = list.subList(0, division); //TO DEVIDE THE DATA OF EACH USERID INTO TWO ALMOST EQUAL PARTS, IT PUT THE FIRST HALF IN SUBLIST

     //HERE I NEED TO WRITE THE OUTPUT OF SUBLIST INTO A CSV FILE, BUT HOW????
            output.write(sublits); //--> THIS DOES NOT WORK SINCE SUBLIST IS NOT A STRING
            currentUserId = userId;
            list.clear();
    }       
     list.add(uLine);
}
    userlines.close();
    output.close();
}

能否有人帮我了解如何将列表字符串中的数据写入空的csv文件?我的第二个问题是:我如何在每个空格处拆分它并将其视为一行。

谢谢。

1个回答

17

你考虑过使用OpenCSV来编写你的值吗:http://opencsv.sourceforge.net/

这里有一个编写CSV文件的示例,非常简单。

至于你的问题,看起来你无法编写这些值,因为ArrayList的toString方法不会返回逗号分隔的字符串。你可以使用这个:

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

    FileWriter writer = new FileWriter("/Users/artur/tmp/csv/sto1.csv");

    List<String> test = new ArrayList<>();
    test.add("Word1");
    test.add("Word2");
    test.add("Word3");
    test.add("Word4");

    String collect = test.stream().collect(Collectors.joining(","));
    System.out.println(collect);

    writer.write(collect);
    writer.close();

}

请查看收集器的实现 - 它将收集所有字符串对象并将它们连接起来,使用您提供的分隔符。输出看起来像这样:

Word1,Word2,Word3,Word4

我希望这能解决你的问题。如果有什么不清楚的地方,请告诉我。

Artur

第二次编辑,回答你的问题。

如果你读入的输入是一个字符串,你可以先按空格分割它,以便将其分为独立的行。如果它是一个实际的数组,这个方法就行不通了。这是我的示例:

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

        String input = "[\"user1\",\"track1\",\"player1\", \"user1\",\"track2\",\"player2\", \"user1\",\"track3\",\"player3\"]";
        input = input.substring(1, input.length() - 1); // get rid of brackets
        String[] split = input.split(" ");

        FileWriter writer = new FileWriter("/Users/artur/tmp/csv/sto1.csv");

        for(String s : split) {
            String[] split2 = s.split(",");
            writer.write(Arrays.asList(split2).stream().collect(Collectors.joining(",")));
            writer.write("\n"); // newline
        }

        writer.close();

    }

生成的文件看起来像这样:

"user1","track1","player1"
"user1","track2","player2"
"user1","track3","player3"

我编辑了答案,将写入文件的部分包含在其中,而不使用opencsv库。这将把收集到的字符串写入文件中。请注意:我没有使其安全。你需要将writer包装在try/catch/finally等语句中,并捕获边缘情况,但它演示了这个想法。 - pandaadb
非常感谢您的大力帮助,它奏效了 :) 只有一个问题:是否有任何方法可以在CSV中添加空格来指定行?(因为我后来需要将其导入mysql)。现在我的输出是这样的:"user1","track1","player1","user1","track2","player2","user1"...,而我需要它变成"user1","track1","player1" "user1","track2","player2" "user1 - mOna
我添加了拆分功能。我从您在问题中输入的内容中获取了一个字符串,我假设这是您从输入文件中读取的字符串。通过空格进行拆分,可以得到行。通过逗号进行拆分,可以得到对象。但是您需要将换行符写入文件中以获取行。 - pandaadb
谢谢你的第二个回答。实际上,当我写input.splitinput.length()-1时,我会遇到错误,可能是因为我使用了bufferedreader读取我的输入csv文件。关于我的输入文件,我从mysql表中导出它,该表与输出文件具有完全相同的列(userId、trackId、playerId)...在输入文件中,行以空格分隔。 - mOna
我相信你需要在你的示例代码中拆分/处理uLine对象。那个字符串代表了我的示例中的输入变量。 - pandaadb
让我们在聊天中继续这个讨论 - pandaadb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接