2016-04-21 11 views
0

Also muss ich einen Ordner von .dat-Dateien durchlaufen, extrahieren Sie die Daten und verwenden Sie INSERT INTO, um die Daten in eine Datenbank einzufügen. HierSQL: Wie man diese Fehler repariert?

ist ein Pastebin einer der Dateien, um die Daten zu sehen, arbeite ich mit:

http://pastebin.com/dn4wQjjE

Um das Skript auszuführen Ich nenne nur:

populate_database.sh directoryWithDatFiles 

und die Inhalte das populate_database.sh-Skript:

rm test.sql; 
sqlite3 test.sql "CREATE TABLE HotelReviews (HotelID SMALLINT, ReviewID SMALLINT, Author CHAR, Content CHAR, Date CHAR, Readers SMALLINT, HelpfulReviews SMALLINT, Over$ 

IFS=$'\n' 
for file in $1/*; 
do 
    author=($(grep "<Author>" $file | sed 's/<Author>//g')); 
    content=($(grep "<Content>" $file | sed 's/<Content>//g')); 
    date=($(grep "<Date>" $file | sed 's/<Date>//g')); 
    readers=($(grep "<No. Reader>" $file | sed 's/<No. Reader>//g')); 
    helpful=($(grep "<No. Helpful>" $file | sed 's/<No. Helpful>//g')); 
    overall=($(grep "<Overall>" $file | sed 's/<Overall>//g')); 
    value=($(grep "<Values>" $file | sed 's/<Value>//g')); 
    rooms=($(grep "<Room>" $file | sed 's/<Room>//g')); 
    location=($(grep "<Location>" $file | sed 's/<Location>//g')); 
    cleanliness=($(grep "<Cleanliness>" $file | sed 's/<Cleanliness>//g')); 
    receptionarea=($(grep "<Check in/front desk>" $file | sed 's/<Check in \/ front desk>//g')); 
    service=($(grep "<Service>" $file | sed 's/<Service>//g')); 
    businessservice=($(grep "<Business service>" $file | sed 's/<Business service>//g')); 

    length=${#author[@]} 
    hotelID="$(echo $file | sed 's/.dat//g' | sed 's/[^0-9]*//g')"; 

    for((i = 0; i < length; i++)); do 
      sqlite3 test.sql "INSERT INTO HotelReviews VALUES($hotelID, $i, 'author', 'content', 'date', ${readers[i]}, ${helpful[i]}, ${overall[i]}, 9, 10, ${location[i]}, ${cleanliness[i]}, ${receptionarea[i]}, ${service[i]}, ${businessservice[i]})"; 
    done 

done 

sqlite3 test.sql "SELECT * FROM HotelReviews;" 

Das Problem, das ich habe Obwohl, obwohl ein Großteil des Skripts funktioniert, gibt es immer noch 5 der 15 Spalten, die ich nicht arbeiten kann. Ich werde Screenshot nur die Fehler, die ich beim Versuch aus, den Code zu ändern:

'author' --> ${author[i]}: http://i.imgur.com/zKQLSqT.jpg 
'content' --> ${content[i]}: http://i.imgur.com/pnirIo3.jpg 
'date' --> ${date[i]}: http://i.imgur.com/urF5DTa.jpg 
9 --> ${value[i]}: http://i.imgur.com/AnBFSWp.jpg 
10 --> ${rooms[i]}: same errors as above 

Wie auch immer, wenn jemand mir auf diesem helfen könnte, würde ich mich massiv dankbar.

Prost!

+0

Ohne zu sehen, dass die Befehle tatsächlich ausgeführt werden, sehen alle wie SQL-Quotierungsfehler aus. Offenbar müssen Sie die Werte in Ihrer SQL-Anweisung angeben. Mit anderen Worten, dies ist effektiv SQL-Injektion. –

+0

Das ist der Befehl hier, oder? sqlite3 test.sql "INSERT IN HotelBewertungen VALUES ($ hotelID, $ i, 'Autor', 'Inhalt', 'Datum', $ {Leser [i]}, $ {hilfreich}, $ {Gesamt [i] }, 9, 10, $ {location [i]}, $ {Sauberkeit [i]}, $ {receptionarea [i]}, $ {service [i]}, $ {businessservice [i]}) "; – Noob

+0

Und wenn sie einfache Zitate Fehler sind, gibt es eine Chance, dass Sie sie beheben/mir einige Hinweise geben können? – Noob

Antwort

0

Wenn Sie mit sehr viel XML arbeiten, empfehle ich, einen SAX-Parser zu kennen, wie den in der Python-Standardbibliothek. Jeder, der bereit ist, ein Shell-Skript wie dieses zu schreiben, hat die Koteletts, um es zu lernen, und das Ergebnis wird leichter zu lesen sein und zumindest ein Gebet haben, um korrekt zu sein.

Wenn Sie mit Regex-Hacking bleiben möchten, wenden Sie sich an awk. Mit „>“ als Feldtrennzeichen, könnte Ihr Skript mit awk Linien vereinfacht werden wie

/<Author>/ { gsub(/'/, "''", $2); author=$2 } 
/<Content>/ { gsub(/'/, "''", $2); content=$2 } 
... 
END { print author, content, ... } 

Die gsub kümmert sich um Ihre SQL zitierte Problem, indem alle einfachen Anführungszeichen in den Daten zu verdoppeln.

Verwandte Themen