2016-03-02 111 views
0

我有這樣一些字符串數組如下(注意,是每一個表現出不同的線條球員......以後的空間),Java編寫的列表字符串轉換成csv文件

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

我想分這數組分成兩部分(幾乎相等),根據行數(這裏是空格)。因此,例如,如果在這個數組中有40個空格,我需要將從第一個到第二個(第20行)開始的行存儲在一個文件中(我們稱之爲文件A),然後將其餘的文件放在文件B中。 I可以劃分數組列表,但我無法以正確的方式在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文件? 我的第二個問題是:我怎麼可能分裂他們,只要有空間,並把它當作一條線..

感謝,

回答

4

你有沒有考慮使用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(); 

} 

見集電極IMPL - 它會收集所有String對象和concatinate它們,使用您提供的分隔符。輸出然後loolks像:

Word1,Word2,Word3,Word4 

我希望能解決您的問題。如果有什麼不清楚,請告訴我。

Artur

編輯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" 
+0

我編輯的答案,包括無opencsv庫寫入文件位。這將收集的字符串寫入文件中。注意:我沒有保證安全。你將不得不把這個作家包裝成一個try/catch/finally等,並抓住邊緣情況,但它表明了這個想法。 – pandaadb

+0

非常感謝您的大力幫助..它的工作:)只有一個問題:有什麼辦法可以把空間指定在csv中的行嗎? (因爲我需要稍後將它導入到mysql中)。現在我的輸出是:''user1「,」track1「,」player1「,」user1「,」track2「,」player2「,」user1「....'而我需要它是''user1」 「track1」,「player1」,「user1」,「track2」,「player2」,「user1」 – mOna

+0

我加了splitting,我把你輸入的問題從我輸入的文件中讀出。空格會給你你的行,用逗號分割它,你需要將新行寫到文件中,但是要把它們排成一行。 – pandaadb