以下は、データベースをJSONにダンプし、Debian wheezyとうまく機能するソースファイルです。
#!/bin/sh
echo "Status: 200"
echo
echo {
printf ".mode csv\nselect * from cfg;" | sqlite3 /home/ftproot/cfg/config.db | while IFS=, read col1 col2
do
if [ "$col2" = "true" -o "$col2" = "false" ]
then
echo "\"$col1\" : $col2,"
else
case $col2 in
*['"']* ) col2=$(echo $col2 | sed 's/\"//g') ;;
esac
echo "\"$col1\" : \"$col2\","
fi
done
echo "\"ZZZZZ\" : \"\""
echo }
Debian Stretch用に更新する必要がありますが、不要なキャリッジリターンが発生します。問題ありません。問題を解決し、このバージョンでは正しい出力を得ました。
#!/bin/sh
echo "Status: 200"
echo
echo {
printf ".mode csv\nselect * from cfg;" | sqlite3 /home/ftproot/cfg/config.db | while IFS=, read col1 col2
do
col2=`echo "$col2" | sed 's/.$//'`
if [ "$col2" = "true" -o "$col2" = "false" ]
then
echo "\"$col1\" : $col2,"
else
case $col2 in
*['"']* ) col2=$(echo $col2 | sed 's/\"//g') ;;
esac
echo "\"$col1\" : \"$col2\","
fi
done
echo "\"ZZZZZ\" : \"\""
echo }
問題は正しいバージョンが非常に遅いことです(データベースは大きくありませんが、私のハードウェアは限られています)。最初のバージョンは約300ミリ秒で実行され、2番目のバージョンは6秒で実行されます。実行速度を上げるには何を変更する必要がありますか?
ありがとうございます!
ベストアンサー1
実行によりパフォーマンスの問題が発生する可能性があります。
col2=`echo "$col2" | sed 's/.$//'`
各行に。注:キャリッジリターンではない場合でも、各行の最後の文字を削除してください。使用することをお勧めしますsed 's/\r$//'
出力全体に対してこれを行うことができます。
printf ".mode csv\nselect * from cfg;" | sqlite3 /home/ftproot/cfg/config.db | sed 's/\r$//' | while IFS=, read col1 col2
すべての文字を削除し'\r'
、行の途中に表示される文字を保持したくない場合でも、tr -d '\r'
置換を使用できますsed 's/\r$//'
。