エントリーをCSVインポートする際に気をつけたい文字列 +小ネタ
これは a-blog cms Advent Calendar 2020 の4日目のエントリーです。
最近エントリーのCSVインポートをした時に悪さをする文字列を発見しました。なので今回を機に怪しそうな文字列をピックアップし、実際にその怪しい文字列を含んだファイルをインポートしてみました。その結果一覧です。
この記事を読むにあたって
この記事を読む前に a-blog cms の機能の一つである、管理画面からできるエントリーのCSVインポートを知っておく必要がありますので軽く紹介させていただきます。
a-blog cmsではエントリーの登録は基本的にサイト内の「エントリー作成」ボタンから行います。しかし、サイトリニューアル時には1000件以上の記事を移行する作業が発生したりします。そんな時に役立つのがエントリーのCSVインポートです。記事となるデータをカンマ区切りにCSVファイルとして作成し、管理画面からボタン一つでデータの流し込みが可能です。特に元々、ある程度固定の入力欄で管理されていたサイトであればより簡単にインポートデータの作成ができます。
詳しいインポート方法は CSVファイルからのインポート | データ管理 | ドキュメント | a-blog cms developer をご覧ください。
テストしてみた文字列
- 制御文字
←おそらく見えないです ... NG
- カンマ
,
... 場合によってはNG - ダブルクォート
"
... 場合によってはNG - バックスラッシュ
\
... 場合によってはNG - シングルクォート
'
... 影響なし
テスト結果詳細
制御文字
インポート結果:
NG
症状:
CSVインポートが始まらない & 終わらない

固まってしまったCSVインポート画面
これは私が実際につまづいた文字列です。いつもCSVファイルを作るときはGoogleスプレッドシートを使用しています。スプレッドシートでは制御文字が半角スペースのように表示されるので一見気付きづらいです。 また、エラー箇所を探るためにテキスエディタでCSVファイルを開いてみたりしたのですが、私が使用しているVS Codeでは制御文字が見えないのがデフォルト設定だったので、なかなかどこでエラーが出ているのか突き止められませんでした。苦労しました...。
制御文字というのはこういう文字です。「制御文字わからないよー」という方はググってみてください!
VS Codeを使っている方は制御文字の表示をONにしておくことをおすすめします。
VS Codeの制御文字表示方法
- Mac: command + shift + P、Windows: Ctrl + Shift + P
- Open Settings(JSON) で検索して settings.json を開く
- 制御文字表示設定をtureにする
"editor.renderControlCharacters": true,
固まってしまったCSVインポート画面の戻し方
制御文字がきっかけでCSVインポート画面が固まってしまった場合、サイトをリロードしても画面が戻らなくなってしまします。そんな時は、cache/csv-import-lock と cache/csv-import-logger.json ファイルを削除しましょう。
「CSV読み込み中」で画面が固まってしまった時はCSVインポート自体もまだされていません。なので、cacheフォルダないのファイル削除後はCSVファイルから制御文字を削除してインポートし直せばOKです。
カンマ
インポート結果:
場合によってはNG
症状:
インポートしたデータが意図しないものになる
NG例
entry_title,test_text エントリータイトル「,」「,」「,」,"これはカンマがタイトルに入っている時のテストです。"
ただし「,」が入っている項目全体を""で囲えば問題なくインポートできました
entry_title,test_text "エントリータイトル「,」「,」「,」","これはカンマがタイトルに入っている時のテストです。"
カンマのところだけを""で囲うのはNGです
entry_title,test_text エントリータイトル"「,」「,」「,」","これはカンマがタイトルに入っている時のテストです。"
ダブルクォート
インポート結果:
場合によってはNG
症状:
改行を含むテキストエリアフィールドにダブルクォートが入っていると、インポートしたデータが意図しないものになる
NG例
entry_title,test_text エントリータイトル ,"改行が使われるような テキストエリアの カスタムフィールドで 「"」が使用されていると ←ここ(ダブルクォートを入れた次の改行)から インポートデータが崩れて 意図しないデータが 入り込む危険があります"
解決方法:
改行ありのデータをダブルクォートで囲いつつ、中のダブルクォートを2重化する。
entry_title,test_text エントリータイトル ,"改行が使われるような テキストエリアの カスタムフィールドで ダブルクォートを使用する場合は ダブルクォートを二重にすれば「""」 エスケープ可能です!"
バックスラッシュ
インポート結果:
場合によってはNG
症状:
CSVインポート時の制御文字として使用されているダブルクォートの前に記載されているとデータ崩れが発生します
NG例(こんな記述する人いないとは思いますが...)
entry_title,test_text テスト,\"テキストエリアなどのフィールドに使われる ダブルクォートをエスケープしています"
問題ない例
entry_title,test_text テスト\,これは\問題ないです
シングルクォート
インポート結果
影響なし
ダブルクォートがNGなのでシングルクォートも危険かなと思いテストしてみましたが、問題なさそうでした。
小ネタ3つ
データインポート関連で気になって調べたことが3つあったので紹介します。
エントリーのcsvインポートに必須項目はない
エントリーのcsvインポートに必須項目はありません。少し驚きでした。どういうことかというと...
test_text "これはフィールドが一つだけだった場合のテストです。"
これだけでもインポートできてしまうということです。エントリータイトル やエントリーIDの列がない場合はa-blog cmsが自動でつけていってくれます。詳しい自動データ入力内容は CSVファイルからのインポート | データ管理 | ドキュメント | a-blog cms developer に記載されています。
a-blog cmsがフォーマットチェックしてくれる項目がある(Ver. 2.11.25時点)
フォーマットチェックに関してはこの12項目かと思います。まだあったらTwitterとかで教えていただけると助かります!!
entry_id | エントリーID | 数値かどうかのチェック |
entry_summary_range | ユニットの「続きを読む」の位置 | |
entry_primary_image | メイン画像のユニットID | |
entry_category_id | カテゴリーID | |
entry_user_id | エントリー所有者ユーザーID | |
entry_status | エントリーステータス | open | close | draft | trash のいづれかであるかチェック |
entry_indexing | インデキシング設定 | on | off のいづれかであるかチェック |
entry_datetime | 日時 | yyyy-MM-dd H:mm:ss のフォーマットであるかチェック |
entry_updated_datetime | 更新日 | |
entry_start_datetime | 公開日時 | |
entry_end_datetime | 掲載期限 | |
entry_posted_datetime | 作成日 |
フォーマットが間違っている時は a-blog cms がエラー通知してくれます。インポート完了時に表示されるエラーの出た「インポート失敗」となっているエントリーデータはインポート対象から除外されます。エラーのでたCSV行のデータを修正し、インポートできなかったエントリーだけ入れ直せばOKです。
管理画面じゃなくてDBから直接流し込むなら acms_sequence を調整すべし
管理画面からのCSVインポートについて気づいたことを書きましたが、管理画面からではインポートできないデータを扱うこともあるかと思います。例えば元々a-blog cms形式ではないエントリーに対するコメントを流し込む場合など。そんな時はDBから流し込むしかありません(たぶん)。
DBから流し込んだ後に調整してほしいDBテーブルがあります。それは acms_sequence です。
acms_sequence の列には既存コメントIDの最大値や、既存エントリーIDの最大値、既存カテゴリーIDの最大値などが記載されています。もしDBから直接データをいれるなら、流し込んだ後に acms_sequence の変更が必要かどうかも確認しましょう。
終わりに
今回はエントリーのCSVインポートの時に気をつけたい文字列をメインに取り上げました。a-blog cms はCSVのフォーマットが崩れていたりするとエラーでお知らせしてくれるので基本的には安心です。しかし、インポートデータの状態によってはエラー通知されない場合があります。インポート前に今回紹介した文字列が潜んでいないか検索かけるなどしてチェックすることをおすすめします。
制御文字については、ファイル内に含まれてるとインポートが実行される前に処理が固まるので、インポート前に絶対検索しないといけない!ということはないかと思います。全ての制御文字を試したわけではないので保証はできません...!!
便利な機能ではありますが、CSVインポート後は目視でざっくりと流し込んだエントリーなどに異常がないかチェックすることが大切だと思います。扱うデータが大量であったり既存データの上書きをする場合は特に注意が必要となります。
次の a-blog cms Advent Calendar 2020 5日目担当は すずきカレーさん です!