2016-06-09 13 views
0

Ich habe versucht, einige Formel Daten in einer CSV-Datei mit der openCSV Java-Bibliothek zu schreiben, aber es schrieb nur etwa 90% der Zeichenfolge in jeder Zelle. Gibt es bekannte Probleme, die dieses Verhalten verursachen können?OpenCSV schreiben Grenzen

public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException { 

     FileOutputStream fosW = new FileOutputStream("C:\\Users\\Desktop\\formula.csv"); 
     OutputStreamWriter osw = new OutputStreamWriter(fosW, "UTF-8"); 
     CSVWriter writerCSW = new CSVWriter(osw); 

     int k = 0; 
     String[] b = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AK", "AL", "AM", "AN", "AO", "AP", "AQ", "AR", "AS", "AT"}; 
     String[] line = new String[100]; 
     for (int i = 0; i < b.length - 1; i++) { 
      String a = "=IF(legend!" + b[i] + "$3='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] + "$3,IF(legend!" + b[i] + "$4='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] + "$4,IF(legend!" + b[i] + "$5='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] + "$5,IF(legend!" + b[i] + "$6='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] + "$6,IF(legend!" + b[i] + "$7='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] + "$7,IF(legend!" + b[i] + "$8='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] + "$8,#error#))))))"; 
      System.out.println(a); 
      line[k] = a; 
      k++; 
     } 
     writerCSW.writeNext(line); 

    } 
+0

Hallo. Ich denke, Sie gehen davon aus, dass jeder Index in Zeile [] 1 Zeile in Ihrem CSV ist. In der Tat, die Art, wie Sie es verwenden, Zeile [] ist genau 1 Eintrag in Ihrer CSV-Datei. Sehen Sie sich die API-Dokumentation an, writeNext nimmt ein Array, das eine Zeile in der CSV-Datei darstellt. Im Wesentlichen müssen Sie Ihren Code neu strukturieren, um jede Zeile innerhalb Ihrer for-Schleife zu schreiben. – pandaadb

+0

@pandaadb Ich weiß, dass es alles in 1 Zeile schreiben würde, das war die Absicht –

Antwort

2

Ich glaube, Ihr Problem ist, dass Sie die Bibliothek falsch verwenden. (Obwohl dies sein könnte ich Missverständnis.

Sie B eine Länge von 46 Ihrer CSV-Datei 45 Einträge haben muss.

Die Linie [k] ist genau 1 Zeile. Ich denke, dass jeder Index davon aus im Zeilenarray ist das. Das ist Fehler Nummer 1 (vielleicht).

Aber der Grund, dass Ihre Datei nicht vollständig ausgefüllt ist, ist, weil Sie den Stream nicht schließen, so dass Daten verloren gehen, sobald Ihr Programm existiert Ich möchte Ihren Writer schließen, oder besser noch, einen Block "try-with-resources" verwenden. Ich habe Ihren Code neu geschrieben, um dies zu tun:

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

     FileOutputStream fosW = new FileOutputStream("/home/artur/tmp/test.csv"); 
     OutputStreamWriter osw = new OutputStreamWriter(fosW, "UTF-8"); 
     try (CSVWriter writerCSW = new CSVWriter(osw)) { 

      String[] b = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", 
        "S", "T", "U", "V", "W", "X", "Y", "Z", "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", 
        "AK", "AL", "AM", "AN", "AO", "AP", "AQ", "AR", "AS", "AT" }; 

      System.out.println(b.length); 
      for (int i = 0; i < b.length - 1; i++) { 
       String a = "=IF(legend!" + b[i] + "$3='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] 
         + "$3,IF(legend!" + b[i] + "$4='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] 
         + "$4,IF(legend!" + b[i] + "$5='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] 
         + "$5,IF(legend!" + b[i] + "$6='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] 
         + "$6,IF(legend!" + b[i] + "$7='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] 
         + "$7,IF(legend!" + b[i] + "$8='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] 
         + "$8,#error#))))))"; 
       String[] line = a.split(","); 
       writerCSW.writeNext(line); 
       System.out.println(i); 
      } 
     } 

    } 

Hinweis, ich habe ein paar Dinge geändert, damit es nicht genau das tut, was Sie wollen. Sie sollten jedoch anhand dieses Beispiels sehen können, was schief gelaufen ist.

Bitte beachten Sie: Sehen Sie, wie ich Ihre Zeichenfolge a durch Kommas getrennt habe? Dies ist ein Array für die CSV-Eingabe zu generieren. Es wird automatisch das gewählte Trennzeichen für Sie einfügen. Wenn Sie dies nicht tun möchten, entfernen Sie den CSVWriter und verwenden Sie einen normalen Filewriter. Sie generieren Ihre CSV-Zeile manuell, indem Sie die Zeichenfolge konstruieren. Dies ist bei Verwendung von OpenCSV nicht notwendig.

Ich hoffe, das hilft,

Artur

+0

danke für Ihre Antwort, wie ich auf Ihrem Kommentar oben sagte ich verstehe, dass die Ausgabe wäre auf 1 Zeile, die meine Absicht war, da ich nur bin beim Generieren einer Rechenformel in Excel. Jedenfalls hattest du recht, dass ich vergessen habe, den Schreiber zu schließen, das hat mein Problem gelöst. Tynx –

+0

Ah toll :) Ich wollte nur auf die Line-Sache hinweisen, weil ich dein Beispiel für Verwirrung gefunden habe. Wenn das deine Absicht war, dann ist das völlig in Ordnung. Sie können die Antwort dann akzeptieren, wenn es Ihr Problem gelöst hat :) – pandaadb