2016-04-21 64 views
0

因此,我必須遍歷.dat文件的文件夾,提取數據並使用INSERT INTO將數據插入到數據庫中。SQL:如何解決這些錯誤?

這裏是其中的一個文件的引擎收錄,看我處理的數據:

http://pastebin.com/dn4wQjjE

要運行腳本,我只要致電:

populate_database.sh directoryWithDatFiles 

和內容populate_database.sh腳本:

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;" 

問題我有雖然,儘管大部分腳本都在工作,但仍然有15個列中有5個不能工作。我就截圖試圖將代碼從改變,當我得到的錯誤:

'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 

無論如何,如果有人可以幫助我走出這一點,我會很感激大量。

乾杯!

+0

沒有看到實際運行的命令,這些都看起來像SQL引用錯誤。它看起來像你需要引用你的SQL語句中的值。換句話說,這是有效的SQL注入。 –

+0

這是這裏的命令,不是嗎? 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]}); – Noob

+0

如果他們是簡單的引用錯誤,有沒有可能修復它們/給我一些指針? – Noob

回答

0

如果您處理很多XML,我建議您開始瞭解SAX解析器,比如Python標準庫中的解析器。任何願意寫這樣的shell腳本的人都可以學習它,結果會更容易閱讀,至少有一個禱告是正確的。

如果您想堅持使用正則表達式,請轉至awk。使用「>」作爲字段分隔符,你的腳本可以使用awk線被簡化像

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

的GSUB需要你的SQL的護理由數據中的任何單引號引用加倍問題。