java将列表字符串写入csv文件

java将列表字符串写入csv文件,java,arrays,csv,writer,Java,Arrays,Csv,Writer,我有一些数组字符串,如下所示(注意,每个播放器后面都有空格,显示不同的行…) 我想根据行数(此处为空格)将此数组分成两部分(几乎相等)。因此,例如,如果这个数组中有40个空格,我需要将从第一行到第二行(第20行)的行存储在一个文件中(我们称之为文件a),将其余的行存储在文件B中。 我可以分割arraylist,但无法在CSV文件中以正确的方式写入它 这是我的密码: public static void main(String[] args) throws java.lang.Exception

我有一些数组字符串,如下所示(注意,每个播放器后面都有空格,显示不同的行…)

我想根据行数(此处为空格)将此数组分成两部分(几乎相等)。因此,例如,如果这个数组中有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();
}
publicstaticvoidmain(字符串[]args)抛出java.lang.Exception{
BufferedReader userlines=新的BufferedReader(新的文件阅读器(“/…../usertrackplayer.csv”);
FileWriter输出=新的FileWriter(新文件(“/…/output.csv”);
字符串uLine=null;
ArrayList=新建ArrayList();
List arrayList=新建arrayList();
字符串currentUserId=null;
而((uLine=userlines.readLine())!=null){
字符串[]userData=uLine.split(“,”);
字符串userId=userData[0];
if(userId.equals(currentUserId)){
//在缓冲相同的用户ID时,我们需要做什么
}
否则{
列表。添加(uLine);
int division=(int)Math.ceil(list.size()/2);
List sublist=List.sublist(0,除法);//为了将每个用户ID的数据分成几乎相等的两部分,它将前一半放在sublist中
//在这里,我需要将子列表的输出写入CSV文件,但是如何呢????
output.write(子列表);//-->这不起作用,因为子列表不是字符串
currentUserId=用户ID;
list.clear();
}       
列表。添加(uLine);
}
userlines.close();
output.close();
}
有人能帮我知道如何将列表字符串中的数据写入空csv文件吗?? 我的第二个问题是:无论空间如何,我如何将它们分开,并将其视为一条直线。p>
谢谢,

您是否考虑过使用OpenCSV来编写您的值:

这里有一个如何编写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();

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

阿图尔

编辑2,针对您的问题

如果您的输入是您读取的字符串,您可以先将其按空格分割,以将其分成几行。如果它是一个实际的数组,它将无法工作。这是我的例子:

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库。这会将收集的字符串写入文件。注意:我没有使它安全。你必须将作者包装成一个try/catch/finally等和catch-edge案例,但它展示了这个想法。非常感谢你的大力帮助。。它起作用了:)还有一个问题:我有没有办法在csv中留出空间来指定行?(因为我以后需要将其导入mysql)。现在我的输出是这样的:
“user1”、“track1”、“player1”、“user1”、“track2”、“player2”、“user1”而我需要它是
“user1”、“track1”、“player1”、“user1”、“track2”、“player2”“user1
我添加了拆分。我从问题中获取了您的输入,我假设这是您从输入文件中读取的字符串。按空格分开可以得到你的线条。用逗号分隔对象。不过,您需要将换行符写入文件中才能使其对齐。谢谢您的第二个答案。。实际上,我在编写
input.split
input.length()-1
时出错,可能是因为我使用
bufferedreader
读取输入csv文件。关于我的输入文件,我从mysql表中导出了它,该表的列与输出文件(userId、trackId、playerId)完全相同。。行在输入文件中用空格分隔。我相信您必须在示例代码中拆分/使用uLine对象。该字符串表示示例中的输入变量。
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"