CSV mit Text und Binärdaten auslesen

Elenteria

Bekanntes Mitglied
Hallo zusammen,

Ich hab Folgendes Problem. Ich hab eine CSV Datei bekommen die ich auslesen und weiterverarbeiten muss. Soweit kein Problem. Das Problem ist das eine Spalte der CSV binärcodierte PDF Dateien enthält. in etwa so: "column1";"[binäre PDF Daten]";"pdf_datei_name";"colum3";"column4";"column5"; usw.

Mein bisheriger Ansatz war die Datei komplett als byte[] einzulesen, dann byte für byte durchzugehen und zu prüfen ob ich einen Zeilenumbruch finde, damit ich eine Zeile hab die ich dann Weiter in die Einzelnen Columns aufsplitten kann. Um zu Verhindern das ein Zeilenumbruch innerhalb der PDF-Daten als Zeilentrenner erkannt wird, prüfe ich ob das PDF Start-Tag bzw End-Tag verarbeitet hab. Solange ich in den PDF Daten bin Ignorier ich alle Zeichenübrüche. Die einzelne Zeile Verarbeite ich dann auf die gleiche Art, nur das ich hier nach einem Semikolon als Trennzeichen suche.
Leider sind die PDF-Dateien die bei mir am Ende Rauskommen nicht Lesbar und ich finde den Fehler nicht.

Mein Parser
Java:
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import my_package.FileReader

public class CSVParser {

    private static final int LINE_BREAK = 10;
    private static final int SEMICOLON = 59;

    public List<CSVRow> parseFile(File csvFile) throws IOException {
        byte[] fileContent = new FileReader().readFile(csvFile);
        int rowStartIndex = 0;
        boolean isInPDFData = false;
        List<CSVRow> rows = new ArrayList<>();
        for(int i = 0; i < fileContent.length; i++) {
            if (fileContent[i] == LINE_BREAK && isInPDFData == false) {
                rows.add(parseRow(Arrays.copyOfRange(fileContent,rowStartIndex, i+1)));
                rowStartIndex = i;
            }
            else if (isPDFStart(fileContent, i)) {
                isInPDFData = true;
            }
            else if (isPDFEnd(fileContent, i) && isInPDFData) {
                isInPDFData = false;
            }
            if(rows.size() == 6) {
                break;
            }
        }
        return rows;
    }

    private CSVRow parseRow(byte[] data) {
        int columnStartIndex = 0;
        boolean isInPDFData = false;
        List<byte[]> columnData = new ArrayList<>();
        for(int i = 0; i < data.length; i++) {
            if (data[i] == SEMICOLON && isInPDFData == false) {
                columnData.add(Arrays.copyOfRange(data,columnStartIndex, i+1));
                columnStartIndex = i;
            }
            else if (isPDFStart(data, i)) {
                isInPDFData = true;
            }
            else if (isPDFEnd(data, i) && isInPDFData) {
                isInPDFData = false;
            }
        }
        byte[] fileData = Arrays.copyOfRange(columnData.get(1),2, columnData.get(1).length -2);
        String fileName = new String(columnData.get(2));
        return new CSVRow(fileName, fileData);
    }


    private boolean isPDFStart(byte[] fileContent, int i) {
        if(i - 5 < 0) {
            return false;
        }
        byte[]  b = Arrays.copyOfRange(fileContent,i-5, i);
        return new String(b).equals("%PDF-");
    }

    private boolean isPDFEnd(byte[] fileContent, int i) {
        if(i -7 < 0) {
            return false;
        }
        byte[]  b = Arrays.copyOfRange(fileContent,i-7, i);
        return new String(b).equals("%%EOF\\\n");
    }

}

Filewriter
Java:
import java.io.FileOutputStream;
import java.io.IOException;

public class FileWriter {

    public void writeFile(String fileName, byte[] data) throws IOException {
        FileOutputStream outputStream = new FileOutputStream(fileName);
        outputStream.write(data);
        outputStream.close();

    }
}

Meine Main
Java:
import java.io.File;
import java.io.IOException;
import java.util.List;

public class Main {

    public static void main(String args[]) {
        File csvFile = new File("daten.csv");
        CSVParser parser = new CSVParser();
        try {
            List<CSVRow> rows = parser.parseFile(csvFile);
            rows.forEach(row -> {
                try {
                    new FileWriter().writeFile(row.getFilename(), row.getFiledata());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Da ich das Projekt nur für einen Einmaligen Datenimport benötige war ich mit der Lesbarkeit ein wenig schluderig *schande über mein Haupt*

Danke schonmal im vorraus für eure Hilfe.
 
K

kneitzel

Gast
Also ich durchschaue das jetzt noch nicht. Eine CSV Datei kann keine binären Daten einfach so führen. Denn selbstverständlich kann eine binäre Datei auch Newlines und Kommas/Semikolons enthalten! Daher ist eine solche Auswertung schlicht nicht möglich.

Daher wäre meine Vermutung, dass die Binären Daten durchaus irgendwie codiert wurden.

Da würde ich an Deiner Stelle noch einmal nachhaken.
 

Elenteria

Bekanntes Mitglied
Genau auf das Problem bin ich auch gestoßen. Deshalb prüfe ich auch ob ich die Sequenz "%PDF-" treffe die Markiert den begin einer PDF Datei. Sobald ich diese Sequenz gefunden haben ignorier ich alle New Lines/Semikolons/Kommas/ etc. Solange bis ich auf die Sequenz "%%EOF" Treff welche das Ende einer PDF Datei markiert.
 

mihe7

Top Contributor
Das Problem ist das eine Spalte der CSV binärcodierte PDF Dateien enthält.
Wer macht denn sowas?!? Da muss man sich ja schon was brechen, um die Datei richtig zu erzeugen (in Java als OutputStream, dann die Strings einzeln in Bytes konvertieren...)

Leider sind die PDF-Dateien die bei mir am Ende Rauskommen nicht Lesbar und ich finde den Fehler nicht.
Hast Du schon einmal die Bytes des PDFs ohne Parser (zu Fuß) herausgelesen und abgespeichert? Funktioniert die PDF dann?
 

Elenteria

Bekanntes Mitglied
Wer macht denn sowas?!? Da muss man sich ja schon was brechen, um die Datei richtig zu erzeugen
Als ich das gesehen hab war mein erster Gedanke auch "Was stimmt denn nicht mit euch" :eek:

Wie meinst du das mit PDF zu Fuß auslesen? CSV als byte[] einlesen und druchlaufen -> wenn das Start-Tag kommt in einer Datei schreiben -> Wenn das End-Tag kommt aufhören in eine Datei zu schreiben.

Oder meinst du was anderes?
 

Elenteria

Bekanntes Mitglied
Ich habs jetzt mal mit einem Hex-Editor versucht. Danke für für den Tipp, auf den Simplen Test bin ich echt nicht gekommen *facepalm*. Die Dateien lassen sich aber auch leider mit der Methode nicht öffnen. Da die Dateien offensichtlich beschädigt sind werd ich jetzt nochmal nachhaken ob ich die Dateien nicht auch anders bekommen kann.
Danke für die Hilfe :)
 

mihe7

Top Contributor
Es könnte natürlich sein (bzw. davon ist auszugehen), dass die Binärdaten kodiert (z. B. UTF-8) geschrieben wurden... Würg.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
K Bildschirm auslesen/ Text erkennen Allgemeine Java-Themen 5
berserkerdq2 Text über einen Shape anzeigen (Scenebuilder) Allgemeine Java-Themen 1
M Thymeleaf th value und th text Allgemeine Java-Themen 1
_user_q Eingegebenen Text Zeile für Zeile ausgeben lassen Allgemeine Java-Themen 11
_user_q Eingegebenen Text wiederholt schreiben lassen Allgemeine Java-Themen 9
G Darstellung von Text auf MapContext von GeoTools Allgemeine Java-Themen 2
Alex_99 Programm stürzt beim Aufruf der Funktion ab? Text ausgeben Allgemeine Java-Themen 45
Mozart53 JLabel nur meinen Text verschieben ohne Image Allgemeine Java-Themen 3
izoards Bestimmter Text aus PDF extrahieren Allgemeine Java-Themen 3
B Scanner erkennt keinen Text in Textdatei, obwohl welcher drinsteht Allgemeine Java-Themen 10
K HTMLEditor HTML Text in Rich Text umwandeln Allgemeine Java-Themen 14
kodela JDialog zeigt Text nicht an Allgemeine Java-Themen 5
L Text filtern Allgemeine Java-Themen 1
Bluedaishi TEXT Kodierung Allgemeine Java-Themen 3
J Die Letzte Zahl aus einer Text datei lesen Allgemeine Java-Themen 8
S Ini Text aus String parsen Allgemeine Java-Themen 1
M itext - Button der Text in Zwischenablage stellt Allgemeine Java-Themen 0
FRI3ND Datentypen Date-Array sortieren - Text mitnehmen? Allgemeine Java-Themen 7
I Text suchen und ersetzen im Word Dokument Allgemeine Java-Themen 3
windl Text mining / deep learning Allgemeine Java-Themen 0
I Text aus Input-Box entnehmen und zuweisen Allgemeine Java-Themen 1
KeexZDeveoper Text Mining Allgemeine Java-Themen 3
L Input/Output Wie kann man in der Konsole einen Text farbig ausgeben z.b in grün Allgemeine Java-Themen 6
B Arrays mit Text und Zahlen füllen Allgemeine Java-Themen 3
A Datenexport (Text und Draw) Allgemeine Java-Themen 1
L Text von txt auf JTextArea Allgemeine Java-Themen 4
N Das Ende von bestimmten zeilen in text datei ändern und speichern Allgemeine Java-Themen 3
A 2D-Grafik Text in ein Bild schreiben Allgemeine Java-Themen 11
T Textarea text wird immer überschrieben Allgemeine Java-Themen 4
I Apache POI Word Text einfügen Allgemeine Java-Themen 26
T itext: text in ein textfeld hinzufügen Allgemeine Java-Themen 2
B Farbiger Text in der Konsole Allgemeine Java-Themen 1
K Pdf mit dynamischem Text mit iText Allgemeine Java-Themen 0
D Text Analyzer Allgemeine Java-Themen 2
RalleYTN Audiodatein(.ogg/.wav) in Text konvertieren Allgemeine Java-Themen 0
L Nach Button drücken den Text festspeichern Allgemeine Java-Themen 9
X Löschen von einer Zeile in einer Text Datei. Klappt nicht. Allgemeine Java-Themen 4
J Text lesen und in Variablen speichern Allgemeine Java-Themen 3
S Text in mehreren Sprachen korrekt darstellen? Wie waehle ich die Fonts aus..? Allgemeine Java-Themen 0
J Java - Zeile aus Text datei löschen Allgemeine Java-Themen 13
M Text in erstelltes Excelfile schreiben Allgemeine Java-Themen 6
N Input/Output Website Text auslesen und bestimmte Zeilen wiedergeben Allgemeine Java-Themen 4
W Arraylist Text Suchen und Datei löschen Allgemeine Java-Themen 5
P HTML Text bearbeiten Allgemeine Java-Themen 1
B JFrame Text Ausgabe Allgemeine Java-Themen 7
G Makierter Text in Arbeitsspeicher Allgemeine Java-Themen 2
B Text in die Mitte der Konsole schreiben. Allgemeine Java-Themen 1
M Variablen Variablen in Text einbinden Allgemeine Java-Themen 5
P iText Text zentrieren Allgemeine Java-Themen 3
J Verschlüsselung von Text? Allgemeine Java-Themen 2
M Text datei in java jar datei einbinden Allgemeine Java-Themen 4
S Swing Text in eine JTextArea schreiben Allgemeine Java-Themen 17
M Verschlüsselung von Text und Files durch RSA (Encoding Problem) Allgemeine Java-Themen 7
S Robuste Methode um Text von HTML code zu extrahieren..? Allgemeine Java-Themen 6
achillesat Rich Text Editor Allgemeine Java-Themen 2
M CMD-Text anzeigen Allgemeine Java-Themen 10
G Text Mining Allgemeine Java-Themen 7
B Text auf Standarddrucker drucken Allgemeine Java-Themen 3
S Library fuer Internet-Text-Daten-Quellen..? Allgemeine Java-Themen 8
nrg Find and replace Text docx Allgemeine Java-Themen 6
M Ein bestimmtes Wort in einem Text zählen (String in String) Allgemeine Java-Themen 9
S Text in for Schleife in Label einfügen Allgemeine Java-Themen 4
M Funktion gesucht: Text vektorisieren Allgemeine Java-Themen 20
D Wort in Text mit >100.000 Wörter finden Allgemeine Java-Themen 7
B Text wird nicht richtig angezeigt Allgemeine Java-Themen 9
Q Text Datei einlesen Allgemeine Java-Themen 27
N .doc text ändern Allgemeine Java-Themen 12
R Komponente hat nicht die gesetzten Eingeschaften (Text, Farbe) Allgemeine Java-Themen 3
M NOA an den Source Text des Dokumentes kommen Allgemeine Java-Themen 7
A Text via RegEx durchsuchen und teile ersetzten Allgemeine Java-Themen 5
O Text mit Wildcard gegen regulären Ausdruck prüfen Allgemeine Java-Themen 3
A Umwandlung von Text/Zeichen in Polynome Allgemeine Java-Themen 8
Y Eclipse ppt Folie erzeugen + text plazieren Allgemeine Java-Themen 4
cedi Eingegebenen Text in der Konsole nicht sichtbar machen oder nur in Sternchen anzeigen Allgemeine Java-Themen 2
D markierten Text kopieren Allgemeine Java-Themen 2
P Doppeltverkettete Listen + Text Allgemeine Java-Themen 5
DEvent embedded Object Database in Text Format Allgemeine Java-Themen 5
C Datei als ASCII text einlesen ? Allgemeine Java-Themen 16
R Texterkennung - Text aus einem/r Bild/Grafik auslesen Allgemeine Java-Themen 2
M String in Html Text umwandeln Allgemeine Java-Themen 2
T eingefügter Text nach dem rendern spiegelverkehrt Allgemeine Java-Themen 2
lumo encoding einer text-datei Allgemeine Java-Themen 2
E Text ans Ende einer Textdatei anfügen Allgemeine Java-Themen 2
E JTextArea / JEditorPane + Text formatieren Allgemeine Java-Themen 3
R Java Text anderer Schriftart einlesen Allgemeine Java-Themen 2
A AES Key aus Text erzeugen Allgemeine Java-Themen 2
S Koordinaten aus einem Text filtern Allgemeine Java-Themen 11
turmaline Text aus Web-Seiten auslesen Allgemeine Java-Themen 1
MQue Graphics2D Text Allgemeine Java-Themen 2
U Text verschmelzen Allgemeine Java-Themen 8
martin82 Java-Code aus Text-Datei parsen Allgemeine Java-Themen 3
W Text curser auswählen für Paste Allgemeine Java-Themen 15
G HTML-Datei einlesen, Plain Text in Textfile speichern Allgemeine Java-Themen 4
S Bestes Text file encoding..? Allgemeine Java-Themen 36
B UTF-8 Text Allgemeine Java-Themen 3
H Passwortgschützter Text Allgemeine Java-Themen 13
C IReport Feldberechnen und als Text ausgeben Allgemeine Java-Themen 4
D Bild in text tabelle umwandeln Allgemeine Java-Themen 2
W Auf markierten Text zugreifen? Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben