Lesen Sie Elemente mit Kommas in CSV-Dateien ohne Aufteilung (Java).

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

Lesen Sie Elemente mit Kommas in CSV-Dateien ohne Aufteilung (Java).
Lesen Sie eine Zeichenfolge in einer PDF-Datei mit Java
Lesen Sie die Java-Eigenschaftendatei in C #
Lesen Sie CSV in Java (Super CSV Annotation)
Lesen Sie die xlsx-Datei in Java mit Selenium
Eine Bat-Datei, die Java in Windows verwendet
[Java] Dateien in src / main / resources lesen
Melden Sie eine CSV-Datei ab, die von Excel mithilfe von Logback gelesen werden kann
So komprimieren Sie eine JAVA-CSV-Datei und verwalten sie in einem Byte-Array
Lesen Sie JSON in Java
Java-Eigenschaftendatei lesen
[Java] Ganzzahlige Informationen von Zeichen in der Textdatei, die mit der Methode read () erfasst wurden
So konvertieren Sie eine Datei in ein Byte-Array in Java
Java11: Führen Sie Java-Code unverändert in einer einzelnen Datei aus
So lesen Sie Ihre eigene YAML-Datei (*****. Yml) in Java
Lesen Sie WAV-Daten als Byte-Array unter Android Java
Aktivieren Sie die Zelle A1 jeder Excel-Datei mit Java
Lesen Sie Binärdateien in Java 1
Lesen Sie die Standardeingabe in Java
[Java] Erstellen Sie eine temporäre Datei
Suchen Sie eine Teilmenge in Java
[Java] [Android] INI-Datei lesen
Textdateien, die in Ressourcen in Java abgelegt sind, können nicht gelesen werden, wenn sie beschädigt sind
Rufen Sie die öffentliche URL der privaten Datei von Flickr in Java ab
[Java] Gibt eine japanische Namensdatei im Dateinamen im HTTP-Header zurück
Einfaches Lesen von Textdateien in Java (Java 11 & Java 7)
3 Implementieren Sie einen einfachen Interpreter in Java
Ich habe ein PDF mit Java erstellt.
Laden Sie Dateien mit Java HttpURLConnection hoch
Führen Sie eine Batchdatei von Java aus
Entpacken Sie die Zip-Datei in Java
Protokollausgabe in Datei in Java
Ein einfaches Beispiel für Rückrufe in Java
[Java] Reflash-Werte für alle Elemente in BeanClass
Informationen zur Dateikopierverarbeitung in Java
Bleiben Sie in einem Java Primer stecken
Die Geschichte, zu vergessen, eine Datei in Java zu schließen und zu scheitern
So erstellen Sie eine Zip-Datei beim Gruppieren von Datenbanksuchergebnissen in Java
Anmerkung: [Java] Wenn sich eine Datei im überwachten Verzeichnis befindet, verarbeiten Sie sie.
Lesen der log4j-Einstellungsdatei in einem Java-Projekt, das in der JAR-Datei Memo zusammengestellt ist