2009-05-27 13 views
1

Ich bin ziemlich neu in diesem, und das ist wahrscheinlich eine ziemlich offensichtliche Antwort. In meinem csv-Skript versuche ich herauszufinden, wie man eine CSV-Datei mit der CSVReader-Klasse liest und in eine neue CSV-Datei schreibt. Der Fehler sagt mir writeNext (java.lang.String []) kann nicht auf (java.lang.String) angewendet werden. Ich habe versucht, eine direkte Zuweisung und getString() -Methode, aber nichts funktioniert. Irgendwelche Ideen?Java: String-Array-Element [] einem String zuweisen?

Ich habe den folgenden Code: AKTUALISIERT

public static void main(String[] args) throws IOException { 
    //read csv file 
    CSVReader reader = new CSVReader(new FileReader(ADDRESS_FILE)); 

    //write to csv file 
    CSVWriter writer2 = new CSVWriter(new FileWriter("output.csv"), '\t'); 

    String [] nextLine; 
    while ((nextLine = reader.readNext()) != null) { 
     System.out.println("Name: [" + nextLine[0] + "]\nAddress: [" + nextLine[1] + "]\nEmail: [" + nextLine[2] + "]"); 
     String[] newRow = new String[] {nextLine[0],nextLine[2], nextLine[1]}; 
    } 

    //writer2.writeNext(entries); 
    writer2.writeAll(newRow); 
    writer2.close(); 

} 

Fehler: c: \ java \ examples \ ETHImport.java: 46: kann nicht symbo Symbol finden: variable newRow Ort: Klasse ETHImport writer2.writeAll (newRow);

1 Fehler

Vielen Dank im Voraus.

+0

Ich bin müde und faul und kümmere mich nicht genug, um alles für dich zu tun: Wo tritt der Fehler auf? – Pesto

+0

In Ihrem neuen Code fehlt einfach "neu". Es sollte "String [] newRow = new String [] ..." –

+0

cool .. das hat wirklich geholfen .. nicht sicher, warum ich ein auf die Variable, die in der while-Schleife deklariert bekommen – phill

Antwort

2
String[] entries = new String[] { "entry1", "entry2"}; 

Es wird ein Array von Einträgen und nicht nur ein String erwartet. Wenn Sie dieses Beispiel sind folgende http://opencsv.sourceforge.net/ Hinweis, dass

String[] entries = "first#second#third".split("#"); 

die geteilte Anruf an den Endergebnissen in einem String [].

für Ihren Code:

public static void main(String[] args) throws IOException { 
     //read csv file 
     CSVReader reader = new CSVReader(new FileReader(ADDRESS_FILE)); 

     //write to csv file 
     CSVWriter writer2 = new CSVWriter(new FileWriter("output.csv"), '\t'); 

     String [] nextLine; 
     while ((nextLine = reader.readNext()) != null) { 
       writer2.writeNext(new String[] {nextLine[0],nextLine[2], nextLine[1]}); 
     } 


     writer2.close(); 

} 
+0

was ich kämpfe ist nur eine Zeichenfolge mit ausgewählten Spalten für jedes Recordset erstellen, so dass ich es in eine neue Datei schreiben kann – phill

+0

Sie sollten keine Zeichenfolge erstellen. Sie sollten ein String * -Array * mit den ausgewählten Spalten erstellen. –

+0

genial! Ich wusste nicht, dass ich etwas in einer Methode erklären könnte. Vielen Dank! – phill

2

leicht ein String in einen String[] Gebrauch genommen:

String[] entriesArr = new String[]{ entries }; 

oder die Abkürzung

String[] entriesArr = { entries }; 

Jetzt entriesArr ist ein String[] ein Element enthält, , entries.

+0

Oder die Verknüpfung, da dies eine Deklaration ist: String [] strs = {str}; –

+0

Guter Anruf! – jjnguy

+0

Beachten Sie, dass das Element ein String-Literalwert sein sollte, also sollte die Zeile tatsächlich String [] entriesArr = new String [] {"entries"} sein. – portfoliobuilder

3

Sie benötigen ein String-Array, keine einzelne Zeichenfolge. Sind Sie wirklich sicher, dass Sie alle Werte zunächst in eine einzige Zeichenfolge ziehen möchten? Ich würde erwarten, dass writeNext eine einzige Zeile basierend auf den String-Werten schreiben Sie geben es, mit es Putting in den Kommas usw. Immerhin ist es ein CsvWriter - es sollte das Komma Trennung tun.

Es sieht für mich wie die writeAll Methode, die Sie bereits verwenden, funktioniert aber was wollen Sie es, und writeNext wird nur eine einzige Zeile schreiben ..., was Sie versuchen zu erreichen, dass writeAll nicht für Sie tun? Warum musst du es Zeile für Zeile lesen und zuerst entries konstruieren? Sie können nicht einfach anrufen:

writer2.writeAll(allElements); 

Meine Vermutung ist, dass eine Registerkarte -separated Datei schreiben geht aber gegeben, wie writer2 aufgebaut ist.

EDIT: die zusätzlichen Informationen in den Kommentaren gegeben, ich vermute, Sie wollen:

  • eröffnen CsvReader
  • Öffnen Sie ein CsvWriter (mit einem geeigneten Writer und ; als Konstruktorargumente)
  • Lesen Sie eine Zeile als Zeichenfolgenarray (unter Verwendung von CsvReader.readNext()), erstellen Sie ein neues Zeichenfolgenarray für die Ausgabe, und rufen Sie dann CsvWriter.writeNext() auf, um dieses Zeichenfolgenarray in die Datei zu schreiben.
  • Schließen Sie die CsvReader und CsvWriter in finally-Blöcke (so werden sie noch geschlossen erhalten, wenn etwas schief geht)

Aufbau des neuen String-Array aus dem bestehenden würde man so etwas wie (nach Ihrem Beispiel) sein:

String[] newRow = new String[] { oldRow[0], oldRow[2], oldRow[1] }; 

Das würde im Grunde nur die ersten drei Spalten halten, um die zweite und dritte umschalten. Wenn Sie andere Spalten benötigen, ändern Sie sie einfach auf die gleiche Weise.

Bitte beachte, dass ich nicht würde mit FileWriter schreiben in eine Datei empfehlen - verwendet ein FileOutputStream und ein OutputStreamWriter auf ihn gekettet, wie auf diese Weise können Sie die Zeichenkodierung einstellen, anstatt eine der Plattform Standard zu verwenden.

+0

Ich bin mir ziemlich sicher, dass du recht hast. Der Javadoc für CsvWriter stimmt mit Ihren Erwartungen überein, aber ich habe ihn nie benutzt. – mkb

+0

Ziel ist es, eine ausgewählte Anzahl von Spalten in der CSV-Datei zu extrahieren, einige von ihnen zu manipulieren/formatieren und sie dann in eine Ausgabedatei mit Kommas einzufügen und ein Semikolon als Zeilenabschlusszeichen zu verwenden. Der Writeall löscht nur alles aus, anstatt nur die Spalten auszugeben, die ich brauche. – phill

+0

Ich habe es mit den vorgeschlagenen Änderungen aktualisiert, aber ich habe jetzt einen anderen Fehler. Es wird gesagt, dass ".class" erwartet wird und es eine Karotte gibt, die auf nextLine verweist. Ist es korrekt, einen String wie diesen in einer while-Schleife zu deklarieren? – phill

0

writer.writeNext (String []) wird für einen Array suchen, dass es als dann schreibt "[0], [1], [2]"

Da man die gesamte CSV-Datei als einer ist, zu speichern string, müssen Sie diese Zeichenkettensicherung aufteilen. Eigentlich sollten Sie nicht jedes Element in einer Zeichenfolge zusammenfassen, sondern es stattdessen als ein Array von Zeichenfolgen speichern, die jede einzelne Zeile in der CSV-Datei darstellen.