2017-11-04 4 views
0

Ich habe Hunderte von PDF-Dateien, die ich analysieren und in MySQL-Tabellen einfügen muss. Ich habe eine PDF-Datei mit der Option -layout in pdftotext konvertiert. Die Daten sind Wählerinformationen im folgenden Format:Pdftotext - parse Daten aus Textdatei und exportiere nach mysql oder json

 
     1 TES1065268         2 TES1306415          3 AP281900579616 
Elector's Name: DINESH ALAMPELLY    Elector's Name: DHURGA PRASAD E      Elector's Name: KADARI JANGAIAH 

Father's Name: SRINIWASULU     Father's Name: BALAIAH E       Father's Name: RAMAIAH 
       ALAMPALLY 
House No:  ---       House No:  00         House No:  1-1 
Age: 23  Sex: Male      Age: 24  Sex: Male        Age: 71  Sex: Male 
    4 HCJ4116364         5 AP281900579174         6 AP281900582129 
Elector's Name: Kadari Venkataiah    Elector's Name: KADARI RAAM SWAMI     Elector's Name: Kadari Lakshmamma 

Father's Name: Jangaiah      Father's Name: JANGAIAH       Husband's Name: Ramasvami 

House No:  1-1       House No:  1-1        House No:  1-1 
Age: 31  Sex: Male      Age: 40  Sex: Male        Age: 36  Sex: Female 
      .            .             . 
      .            .             . 
      .            .             . 
      .            .             .   

Ich muss diese Daten in mysql-Tabelle namens "Wähler" exportieren. Oder ist es einfacher, dies zuerst in JSON zu konvertieren, da bereits Doppelpunktdaten vorhanden sind? Ich habe versucht, mit sed, tr-Spalte, falten, aber nicht in der Lage, eine Lösung zu erreichen. Bitte helfen :)

+1

Dies könnte helfen: https://www.google.com/search?q=site:stackoverflow.com+bash+insert+mysql – Cyrus

Antwort

0

Dies könnte für Sie arbeiten (GNU sed):

Teilen Sie die Datei in 3, eine für jede Spalte:

sed -rn -e 's/^(.{46})(.{52})/\1\n\2\n/;h;s/\n.*//w col1' -e 'g;s/.*\n(.*)\n.*/\1/w col2' -e 'g;s/.*\n//w col3' file 

Collapse jeder Datensatz in eine kommagetrennte Zeile:

sed -ri.bak 'N;N;N;N;s/^\s*(\S+)\s/\1,/;s/\n/,/g;s/\s*,[^:]*:\s*/,/g;s/\s*Sex:\s*(\S+)\s*/,\1/' col{1,2,3} 

Fachzugriff Aufzeichnungen in der richtigen Reihenfolge mit Paste:

paste -d'\n' col{1,2,3} >csvFile 

Wenn Sie Header wollen verwenden:

sed 'N;N;N;N;s/Sex:/\n&/;s/\n/,/g;s/^[^,]*/Rowid,Key/;s/:[^,]*//g;q' col1.bak >headers 
sed -i.bak '1e cat headers' csvFile 
+0

Vielen Dank für Ihre detaillierte Lösung, aber etwas schief gehen einige wo. Ich werde versuchen, Ihre Lösung zu verbessern. – Naveed

+0

Pls überprüfen Sie die Antwort, die ich gepostet habe und bitte geben Sie Ihre Meinung – Naveed

0

Dies ist, wie ich es gehen möchte:

  1. Verwendung grep (oder einen anderen Befehl) Wähler-IDs (1 TES1065268 zu holen, in diesem sollte die Nummer 1 entfernt werden, was später gemacht werden kann).
    a) Um dies zu ermöglichen, fügen Sie ein Schlüsselwort "voterid" in alle Zeilen mit den Wähleridentitäten ein, und verwenden Sie grep, um alle diese IDs zu extrahieren und sie in einer anderen Datei in einer Spalte und nicht in einer Zeile auszudrucken.

  2. Verwenden Sie grep (oder einen anderen Befehl), um Felder wie Elector's Name:, Vatersname: usw. abzugleichen, und nehmen Sie den entsprechenden Wert und drucken Sie in nachfolgenden Spalten neben den Voterid-Spalten in der neuen Datei.

Auf diese Weise können wir eine saubere Spalte Daten erhalten. Aber an einigen Stellen in der Textdatei ist der Name in zwei Zeilen aufgeteilt. Wie geht es?

Bitte geben Sie mir in dieser Hinsicht zusätzliche Eingaben.