Anzeige:
Ergebnis 1 bis 10 von 10

Thema: Daten aus CSV Datei verarbeiten

  1. #1
    Registrierter Benutzer
    Registriert seit
    Jan 2018
    Beiträge
    23

    Question Daten aus CSV Datei verarbeiten

    Hallo Community,

    derzeit stehe ich vor einem kleinen Problem und benötige einen Denkanstoß.

    Ich habe eine CSV-Datei die ich in eine XML Datei umwandeln möchte, soweit ist das kein Problem, aber es gibt in der CSV Zellen die mehrere Zeilen beinhalten.

    Hier ein einfaches Beispiel:

    1;3;444;493;"Das ist
    die Zelle
    die ich meine"
    2;5;423;409;ffff
    3;5;453;455;ffuh

    wenn ich jetzt die CSV Datei Zeile für Zeile bearbeite, dann führt das natürlich zu einem Fehler, da die zweite Zeile in dem Beispiel als neuer Datensatz verstanden wird.
    Hättet ihr einen Tipp für mich wie ich damit umgehen kann?

    System: Debian 10 (VM)
    Code bisher in Linux Bash

    Gruß Tobi

  2. #2
    Registrierter Benutzer Avatar von ThorstenHirsch
    Registriert seit
    Nov 2002
    Beiträge
    6.548
    Das ist keine gültige CSV-Datei, gib sie dem Excel-Akrobat zurück.
    Ernsthaft: ich würde zuerst alle Zeilenumbrüche per Suchen&Ersetzen ändern, z.B. in ein Leerzeichen oder ein Zeichen, das in der Datei nicht vorkommt. Dann kannst du sie normal verarbeiten und immer noch entscheiden, was du mit dem Zeichen machst.
    ¡Nuestro amigo... el Computador!

  3. #3
    Registrierter Benutzer Avatar von Huhn Hur Tu
    Registriert seit
    Nov 2003
    Ort
    Karlsruhe
    Beiträge
    2.220
    Zuerst mal klug*******en CSV heisst "Comma Seperated .." du hast also ein SSV so viel zur Klug*******erei.
    Als zweites, empfehle demjenigen, welcher die Daten erzeugt hat, je nach OS, unter windows, mal und Laufwerk c:/ das VCerzeichniss "system32" mit den 32Bit Resten zu loeschen, bzw. unter Linux "/etc/apparmor*" dann klappt das auch mit den Daten. Sorry den konnte ich mir gerade nicht verkneifen.


    Eine Moeglichkeit ist


    deine Datenonjekte mit einen distintectn Zeichen zu umfassen, heisst alles was darin ist, ist ein Objekt was zu XML werden kann, evtl. ueber den Umweg Json.
    cat Datafile | grep "[0-9]" | sed 's/^/@@/g'
    head -n1 | sed 's/^@//g'
    tail -n1 | sed 's/^@//g'
    also alles was zwischen einem Paar @@ liegt ist ein Objekt

    @1;3;444;493;"Das ist
    die Zelle
    die ich meine"
    @@2;5;423;409;ffff
    @@3;5;453;455;ffuh@
    zum verarbeiten, aber ich empfehle die Loesung mit dem loeschen von system32
    Zwischen anonym sein wollen und seine Daten nicht verkaufen wollen, liegen zwei Welten. Wenn man sich einen kostenpflichtigen Dienst sucht, dann meist, weil man für diese Dienstleistung zahlt und nicht selbst das Produkt sein will.


  4. #4
    Registrierter Benutzer
    Registriert seit
    Apr 2009
    Ort
    Erde
    Beiträge
    2.774
    Du könntest außerdem Umschalten, so in die Richtung, wenn nach einem S Wert ( ; ) ein " folgt, wird der Block erst dann geschlossen, wenn du wieder ein " findest.
    Alternativ statt aller Zeilenumbrüche würde ich nur die nehmen, die "doof" sind - s/^([^"]+"[^"\n]+)\n/$1/g; das muss aber wiederholt werden, bis es keine Treffer mehr gibt

    Naja schön ist das alles nicht
    Geändert von nopes (15.11.23 um 13:34 Uhr) Grund: regex
    Gruß nopes
    (,,,)---(^.^)---(,,,) /var/log/messages | grep cat

  5. #5
    Registrierter Benutzer
    Registriert seit
    Dec 2003
    Ort
    Dettenhausen
    Beiträge
    22.027
    An all jene, die sagen "dat geht mal gar nicht": https://www.rfc-editor.org/rfc/rfc4180, 2.6:
    6. Fields containing line breaks (CRLF), double quotes, and commas
    should be enclosed in double-quotes. For example:

    "aaa","b CRLF
    bb","ccc" CRLF
    zzz,yyy,xxx
    erste Frage: einmalig oder wiederholend?

    Falls einmalig: Date in Libreoffice reinladen und als XML exportieren.
    Falls mehrmals: Es gibt nette Libs, Converter-Tools, die einem den Stress abnehmen.
    Ich bin root - ich darf das.

  6. #6
    Registrierter Benutzer
    Registriert seit
    Jan 2018
    Beiträge
    23
    Zitat Zitat von marce Beitrag anzeigen
    An all jene, die sagen "dat geht mal gar nicht": https://www.rfc-editor.org/rfc/rfc4180, 2.6:


    erste Frage: einmalig oder wiederholend?

    Falls einmalig: Date in Libreoffice reinladen und als XML exportieren.
    Falls mehrmals: Es gibt nette Libs, Converter-Tools, die einem den Stress abnehmen.
    Danke für eure Antworten.

    Für den genaueren Hintergrund noch ein paar Informationen.
    Wir haben ca. 1000-1500 Textbausteine die mit Leerzeichen und Zeilenumbrüchen formatiert sind und diese Formatierung beibehalten werden müsste (daher bringt es mir nichts die Zeilenumbrüche zu entfernen).
    Diese Daten stehen aktuell in einer CSV-Datei (wie in meinem Beispiel vereinfacht dargestellt) und müssen im XML-Format in das Zielsystem importiert werden.
    Wenn das klappen sollte, wären noch 3 weitere CSV-Dateien vorhanden, mit der gleichen Größe, die umgewandelt werden müssten.

    die Daten müssten dann in eine XML Format umgewandelt werden, was wie gesagt kein Problem ist bis auf die Zeilen mit Umbrüchen.
    Bei XML sind die Umbrüche kein Problem, diese lassen sich dann einfach in das Zielsystem importieren Beispiel:

    <Tabelle1>
    <Format>1</Format>
    <tests>Name</tests>
    <test>bla</test>
    </tests>
    <Description>AT2-Beschreibung</Description>
    <Body>langertext der mehr als eine Zeile betrifft
    Bla bala
    bla bla
    blaaaaaaaa</Body>
    </Tabelle1>

    Bei den Convertern hatte ich bis jetzt das Problem, dass eingerückte Bereiche wie in dem oberen Beispiel <tests> nicht berücksichtig wurden da ich es in der csv nicht darstellen konnte und daher nur eine Ebene verarbeitet wurden (hoffe das ist verständlich ausgedrückt).

    @Nopes
    Du könntest außerdem Umschalten, so in die Richtung, wenn nach einem S Wert ( ; ) ein " folgt, wird der Block erst dann geschlossen, wenn du wieder ein " findest.
    Sowas hatte ich gesucht, aber nicht gefunden, hättest du ein Beispiel für mich?

    @Huhn Hur Tu das teste ich mal danke!

  7. #7
    Registrierter Benutzer
    Registriert seit
    Dec 2003
    Ort
    Dettenhausen
    Beiträge
    22.027
    Zitat Zitat von nopes Beitrag anzeigen
    Du könntest außerdem Umschalten, so in die Richtung, wenn nach einem S Wert ( ; ) ein " folgt, wird der Block erst dann geschlossen, wenn du wieder ein " findest.
    wird nicht klappen, da in den :"[...]"-Bereichen ja wiederum escapte " vorkommen können.

    @TE: woher sollen denn die
    Code:
    <tests>Name</tests>
    <test>bla</test>
    </tests>
    -Bereiche kommen? Ich seh' die in der CSV nicht.

    Ich würde trotzdem weiter mit den default-Convertern arbeiten - die gibt's in jeder bel. Sprache und perl z.B. oder php, go, python sollte bei heutigen Disitris ja problemlos installierbar sein oder schon installiert sein.

    Ggf. könnte man sich auch noch sowas wie Jinja-Templating anschauen.
    Ich bin root - ich darf das.

  8. #8
    Registrierter Benutzer
    Registriert seit
    Apr 2009
    Ort
    Erde
    Beiträge
    2.774
    Wenn du schon XML Schreibst, würde ich mir das ganze Escaping dafür sparen und die Blöcke in eine CDATA Section schreiben. Das mit dem Umschalten des Trennzeichens würde ich etwa so lösen - sa https://onlinegdb.com/PgxLe-YMR
    Code:
    def to_xml_string(csv_string):
        '''little helper to convert a csv string into a xml string'''
        blockNo=0
        blockContent = ''
        escaped = False
        delimeter = ';'
        print('  <entry>')
        for char in csv_string:
            if char == '\\':
                escaped = True
                continue
            elif char == '"' and delimeter == ';':
                delimeter = '"'
                continue
    
            if escaped:
                blockContent = blockContent + '\\' + char
                escaped = False
                continue
            
            if char == delimeter:
                blockNo = blockNo + 1;
                print('    <block><![CDATA[{}]]></block>'.format(blockContent.strip('\n')))
                blockContent = ''
                if delimeter == '"':
                    delimeter = ';'
            else:
                blockContent = blockContent + char
            
            
            if blockNo == 5:
                print('  </entry>')
                n = 0
            
        print('    <block><![CDATA[{}]]></block>'.format(blockContent.strip('\n')))
        print('  </entry>')
        
    
    
    #
    # main
    #
    data1='1;3;444;493;"Das ist\ndie Zelle\ndie ich meine"\n2;5;423;409;ffff\n' # some test data from a string
    data2=''
    with open('data.csv', 'r') as f: # some test data from a file
        data2 = f.read()
    
    print('<?xml version="1.0" encoding="UTF-8">')
    print('<root>')
    to_xml_string(data1)
    to_xml_string(data2)
    print('</root>')
    Erzeugt diese Ausgabe:
    Code:
    <?xml version="1.0" encoding="UTF-8">
    <root>
      <entry>
        <block><![CDATA[1]]></block>
        <block><![CDATA[3]]></block>
        <block><![CDATA[444]]></block>
        <block><![CDATA[493]]></block>
        <block><![CDATA[Das ist
    die Zelle
    die ich meine]]></block>
      </entry>
      </entry>
      </entry>
        <block><![CDATA[2]]></block>
        <block><![CDATA[5]]></block>
        <block><![CDATA[423]]></block>
        <block><![CDATA[409]]></block>
        <block><![CDATA[ffff]]></block>
      </entry>
      <entry>
        <block><![CDATA[4]]></block>
        <block><![CDATA[7]]></block>
        <block><![CDATA[777]]></block>
        <block><![CDATA[4242]]></block>
        <block><![CDATA[Das ist
     die Zelle
     die ich meine - aus einer Datei mit \"Sonderzeichen\"]]></block>
      </entry>
      </entry>
      </entry>
        <block><![CDATA[5]]></block>
        <block><![CDATA[6]]></block>
        <block><![CDATA[423]]></block>
        <block><![CDATA[409]]></block>
        <block><![CDATA[ffff]]></block>
      </entry>
    </root>

    [edit]Ein kleinen Fehler steckt drin, den musst du ggf selber finden und beheben
    Geändert von nopes (16.11.23 um 21:31 Uhr) Grund: Hinweise auf Fehler im Code
    Gruß nopes
    (,,,)---(^.^)---(,,,) /var/log/messages | grep cat

  9. #9
    Registrierter Benutzer
    Registriert seit
    Dec 2003
    Ort
    Dettenhausen
    Beiträge
    22.027
    " wird in csv nicht mit \ sondern mit " escaped. :-)
    Ich bin root - ich darf das.

  10. #10
    Registrierter Benutzer
    Registriert seit
    Jan 2018
    Beiträge
    23
    Danke für eure Hilfe, das Problem konnte ich mit dem Onlineconverter: https://www.convertcsv.com/csv-to-xml.htm beheben.
    Die Scriptvorschläge habe ich getestet, aber ich bin ehrlich gesagt nicht ganz dahinter gekommen wie es funktioniert.
    Aber sobald ich mehr Zeit habe, werde ich mich dem Thema nochmal widmen!

Ähnliche Themen

  1. Sortieren von Daten in csv.Datei
    Von Lina im Forum Linux Allgemein
    Antworten: 1
    Letzter Beitrag: 01.02.22, 11:13
  2. daten aus datei auslesen (grep, cut, sed?)
    Von linuxazubi im Forum Linux Allgemein
    Antworten: 9
    Letzter Beitrag: 22.02.11, 16:16
  3. gnuplot ; daten aus csv file verarbeiten
    Von mbrand5371 im Forum Anwendungen Allgemein, Software
    Antworten: 6
    Letzter Beitrag: 05.03.09, 16:11
  4. Verarbeiten von Daten, welche per Mail zugesandt werden.
    Von kermit. im Forum Linux Allgemein
    Antworten: 1
    Letzter Beitrag: 25.05.05, 23:18
  5. Daten in Datei sortieren?
    Von peter1962 im Forum Linux Allgemein
    Antworten: 4
    Letzter Beitrag: 13.09.03, 18:53

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •