はじめに
少し前に対応した案件の話です。
お客様から
「CSVデータの項目の一つに、改行コードを1つ含む場合がある。
なので、この項目は 改行コードの前後で2つに分けて出力 したい」
でも、こんな CSVデータって、故意に作れるの?
と疑ってみましたが、Excel ファイルから作った CSV ファイルではアルアルのようですね。
例えば、以下のようなExcelの一覧(2項目の出荷が2日になった)を、
ファイル > 名前を付けて保存 > CSV (コンマ区切り)(*.CSV)
で保存すると、なんじゃコレ(囲み文字が中途半端)なCSVファイルが出来ちゃいました。
そこで、Google Chrome で「Excel csv 出力 囲み文字」と検索すると、AIが概要で
Excelは標準の「CSV保存」機能では、カンマや改行が含まれるセル以外(通常の数値や文字)にダブルクォーテーション(囲み文字)を自動付与しません。
すべての値に囲み文字を付けて出力するには、テキストエディタでの置換やVBA、専用フリーソフトを活用します。
と教えてくれました。
お見せできませんが、お客様から預かったCSVファイルもこんな感じだったので、恐らくExcel生まれのCSVファイルのようです。
ここから下の説明は、DataMagic が普通に扱えることを前提に、ピンポイントで説明しています。
入力項目の出荷日 は 以下のいずれかを想定
・一つ目の日付 のみ
・一つ目の日付 / 改行コード / 二つ目の日付
改行コードの前後で2つに分けて出力
では、2日になる場合のある 出荷日 を、出荷日1、出荷日2 に分けて出力してみます。
色々な方法があると思いますが、私の方法は以下になります。
1.抽出条件1 で 変数 を編集
まず、変数を2つ用意します。私は以下の2つを用意しました。
| 変数名 | 変数タイプ | 内容 |
|---|---|---|
| Flag | 数値 | 改行の有無 |
| 出荷日2 | 文字列 | 二つ目の日付 |
変数:Flag で出荷日 に改行コードが含まれているかを判断します。
| 改行 | 処理 |
|---|---|
| 含まれている(一致する) | 変数:Flagに 1 を代入 |
| 含まれてない(一致しない) | 変数:Flagに 0 を代入 |
判断方法
関数)MATCH_REG{\s,1,0}
変数:出荷日2 に二つ目の日付を代入します。
代入方法
関数)REPLACE_REG{^(././.)(\s+)(././.)$,$3}
2.抽出条件2 で 出力ファイル を編集
品目名は普通に関係線を引きます。
出荷日1 に1つ目の出荷日を出力します。
改行コードを2回に分けて外します。
改行コードはOSや環境によって使い分けられています。
| 改行コード | 意味 | 使用されるOS | 表 現 |
|---|---|---|---|
| LF Line Feed |
次の行へ移動する | LinuxやmacOSなどのUnix系OS | \n |
| CRLF Carriage Return + Line Feed |
行頭に戻る(CR)と 次の行へ移動(LF)を組み合わせたもの |
Windows | \r\n |
関数)
1行目 = REPLACE_REG{^(././.)(\n)(././.)$,$1}
LFより左を取得
2行目 = REPLACE_REG{/\r/,//}
CRが有れば削除
出荷日2 に2つ目の出荷日を出力します。
関数)IF{\$VAR(Flag)==0,"",$VAR(出荷日2)}
私の実力では、変数:出荷日2を編集する際、出荷日が1日(改行コードを含まない)の場合、一つ目の日付を代入してしまうので、改行の有無を確認し、
・改行がない(変数:Flag=0)場合は、空値を代入
・改行がある(変数:Flag=1)場合は、変数:出荷日2 の値を代入
3.その他の設定
システム動作環境設定
データ加工設定で「改行を項目の一部として扱う」に ![]()
当該項目は全体の動作に影響するので、変更する場合は要注意 です![]()
オプション
「CSV囲み文字無し項目への文字入力」を
許可する
上記の設定以外は、普段通りの設定でOKです。
4.データ加工処理
| 確認方法 | 表示結果 |
|---|---|
| プレビュー | ![]() |
| メモ帳で開く | ![]() |
|
以上です。











