line 1: expected 10 columns of data but found 1 エラー解決策/SQLite3

このブログを書いてるWord PressではMySQLというDB(データベース)を使っているが、iPhoneなどのモバイル用OSではSQLite3を使っている場合が結構あるみたい。

iPhoneのバックアップデータをいろいろ覗いている時によくわからない拡張子があったので、調べてみるとSQLiteのDBファイルだった。

SQLiteは拡張子が任意に付けられるので、謎の拡張子なのも納得

電話帳とか画像ファイル管理とか結構使われてますね。

SQLiteは1ファイルが1DBなので、バックアップもファイルをコピーするだけでできるのですごく扱いやすい。

他にiPhoneではplistというxmlファイルに固有情報などが入ってましたね

ともかく今回のテーマは line 1: expected 10 columns of data but found 1 というエラーについて

ググっても探せなかったが、自分で解決できたので公開しておきます

例えばcsvとかtxtファイルから、SQLiteにインポートするときに、区切り文字を認識する必要がある

TextEditorによっては区切り文字を選択できたり、Excelから別名保存するときにcsv形式を選ぶと,(カンマ)区切りとかありますよね。

SQLiteをコマンドプロンプトでDOS窓から扱う場合、デフォの区切りは|(パイプ)になっている

.separator というコマンドで区切り文字を変えられるんだけど、そこだけではダメなのがわかった。

ボクがやりたかったのは、マクロとかUWSCを使ってExcelに入力したリストからSQLiteのDBを作成するというのを自動化することだった。

Excelから直接インポートは巷に出回っているGUIのツールを使えばできるんだけど、自動化するのはちょっと難しい。

そこで、マクロかUWSCを使ってExcelファイルを一旦メモ帳でtxtファイルに書き出し、それをインポートしようという思惑

しかし、メモ帳だとExcelからコピーした場合の区切り文字はtabになる

それを|(パイプ)に置換するという方法もあるが、データそのものをいじくり回すより、SQLite側の設定を変更したほうが、スマートかな?と思い、そっちでいく事にした

.separator tabs

を実行して、インポートしてみると問題の line 1: expected 10 columns of data but found 1 エラーが出てしまって入らない

“わたしゃ10カラム分のデータを期待してるのに、1個しかないじゃん!”と怒られてしまった

要は区切り文字が認識されていないってことですね

ハイハイ。見てみりゃ良いんでしょ
sqlite> .show
echo: off
explain: off
headers: off
mode: list
nullvalue: “”
output: stdout
separator: “tabs”
stats: off
width:

ちゃんとなってるじゃん

でもちょっと待て

テーブルを作成する時のコマンドをよく見てみた
sqlite> CREATE TABLE tablename (“A” , “B” , “C” , “D” , “E” , “F” , “G” , “H” , “I”, “J” );
なるほど、コレのせいかテーブルを作成するときのcolum名の区切り文字が影響してそう

一旦テーブルを削除して、再度区切り文字をtabにしてやってみた
sqlite> DROP TABLE tablename; //テーブル削除
sqlite> CREATE TABLE tablename (“A” “B” “C” “D” “E” “F” “G” “H” “I” “J” ); //テーブル作成。わかりにくいけどtab区切り
sqlite> .import “c:\\sqlite3\\テストメモ.txt” tablename //Textファイルのインポート

上手くいった

ありがちだけど、ハマると大変だからお気を付けあそばせ。osamushi

コメント