Wenn die CSV-Datei ein Element mit einem Komma enthält, wird das Problem der Aufteilung in der Mitte des Elements gelöst, wenn Sie es mit der normalen String.split-Methode teilen.
Zum Beispiel, wenn es einen solchen CSV-Datensatz gibt
test.csv
ABC,DEF,GHI,'1,000,000',JKL,MN
Wenn Sie diesen Datensatz mit Kommas teilen möchten, nehmen Sie an, Sie möchten diese Zeichenfolge in Anführungszeichen als einzelne Zeichenfolge teilen, ohne sie durch Kommas zu trennen.
Das erwartete Ergebnis zu diesem Zeitpunkt ist
Erwartete Ergebnisse
ABC
DEF
GHI
'1,000,000'
JKL
MN
Wenn Sie die Aufteilungsmethode jedoch normal verwenden, wird sie wie folgt aufgeteilt.
split(",")Enttäuschendes Ergebnis von
ABC
DEF
GHI
'1
000
000'
JKL
MN
Ich habe versucht herauszufinden, was passiert ist, wie zum Beispiel reguläre Ausdrücke, aber in erster Linie ist die Split-Methode
"Teilen, wenn Bedingungen erfüllt sind" Ist eine Methode
"Nicht teilen, wenn die Bedingungen erfüllt sind" Ich kann das nicht sagen (in diesem Fall ist die Bedingung "ein in Anführungszeichen eingeschlossenes Komma", und ich kann nicht sagen, dass es sich nicht nur aufteilt, wenn diese Bedingung erfüllt ist), also habe ich aufgegeben und meine eigene Methode erstellt.
Main.java
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) throws IOException {
try {
String fileName= "C:\\temp\\test.csv"; //CSV-Datei, die Sie lesen möchten
//CSV-Eingabedatei lesen
File file= new File(fileName);
FileInputStream input = new FileInputStream(file);
InputStreamReader stream= new InputStreamReader(input,"SJIS");
BufferedReader br = new BufferedReader(stream);
String line = br.readLine();
//Rufen Sie Ihre eigene Methode auf
List<String> data = csvSplit(line);
for (String col : data) {
System.out.print(col + "\r\n");
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static List<String> csvSplit(String line) {
char c;
StringBuilder s = new StringBuilder();
List<String> data = new ArrayList<String>();
boolean singleQuoteFlg = false;
for(int i=0; i < line.length(); i++){
c = line.charAt(i);
if (c == ',' && !singleQuoteFlg) {
data.add(s.toString());
s.delete(0,s.length());
} else if (c == ',' && singleQuoteFlg) {
s.append(c);
} else if (c == '\'') {
singleQuoteFlg = !singleQuoteFlg;
s.append(c);
} else {
s.append(c);
}
}
return data;
}
}
Unten sind die Ausführungsergebnisse.
Ausführungsergebnis
ABC
DEF
GHI
'1,000,000'
JKL
Die Kommas in Anführungszeichen werden nicht getrennt und werden ordnungsgemäß als einzelne Zeichenfolge betrachtet.
Was machst du
--Lesen Sie einen CSV-Datensatz (String line = br.readLine ();)
Die Erklärung der Logik ist wie folgt. Wenn Sie keine einfachen Anführungszeichen in die Ausgabe aufnehmen möchten, werden diese übrigens nicht in die Ausgabe aufgenommen, es sei denn, Sie verketten mit StringBuilder.
Nach der Änderung csvSplit
private static List<String> csvSplit(String line) {
char c;
StringBuilder s = new StringBuilder();
List<String> data = new ArrayList<String>();
boolean singleQuoteFlg = false;
for(int i=0; i < line.length(); i++){
c = line.charAt(i);
if (c == ',' && !singleQuoteFlg) {
data.add(s.toString());
s.delete(0,s.length());
} else if (c == ',' && singleQuoteFlg) {
s.append(c);
} else if (c == '\'') {
singleQuoteFlg = !singleQuoteFlg;
// s.append(c); //Wenn Sie keine Zeichen mehr verbinden, werden keine einfachen Anführungszeichen ausgegeben!
} else {
s.append(c);
}
}
return data;
}
Ausführungsergebnis (ohne einfaches Anführungszeichen)
ABC
DEF
GHI
1,000,000
JKL
Ich fühle mich so.
Wenn es einen anderen guten Weg gibt, würde ich es begrüßen, wenn Sie mich unterrichten könnten!
Recommended Posts