0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【DataMagic】ちょっとブレイク!CSVデータをフォーマット形式で扱ってもイイじゃん

0
Last updated at Posted at 2026-10-03

はじめに

一つ前のこの投稿 :arrow_heading_down: では、

複数のレコードをつないで、1レコードにして出力する例を投稿しましたが、この記事を書きながら『レコードをつなぐだけだから、マッピング情報設定の画面でマッピングする項目数、減らせないかなぁ :thinking: 』と、考えてみました。

結論としては、

普通のCSVデータ(全部キャラクタでできてる)なら、フォーマット形式をアレンジすると、入力項目から出力項目にゴッソリ持って行けることが判明したので、プチ裏技として :wink:

入力データ

今回の入力データは以下を使用します。

入力データ
"R0808051816","H","73841","2026/08/05"
"R0808051816","M","10","シャインマスカット",015,00880.00,0013200.00
"R0808051816","M","20","巨峰       ",015,00660.00,0009900.00
"R0808051816","M","30","プラム      ",005,00500.00,0002500.00
"R0808051816","M","40","白桃       ",010,00400.00,0004000.00
"R0808051816","F",00029600.00,10.0,002960.00,00032560.00
"R0808131820","H","57918","2026/08/13"
"R0808131820","M","10","にんじん     ",005,00123.00,0000615.00
"R0808131820","M","20","じゃがいも    ",005,00234.00,0001170.00
"R0808131820","M","30","かぼちゃ     ",005,00456.00,0002280.00
"R0808131820","F",00004065.00,10.0,000406.50,00004471.50
"R0808141822","H","91423","2026/08/14"
"R0808141822","M","10","バナナ      ",003,00111.00,0000333.00
"R0808141822","M","20","キーウィ     ",003,00222.00,0000666.00
"R0808141822","M","30","なす       ",002,00333.00,0000666.00
"R0808141822","M","40","ピーマン     ",002,00444.00,0000888.00
"R0808141822","F",00002553.00,10.0,000255.30,00002808.30

上記の入力データから、下図のようにレコードのフォーマット考えてみました。

Qiita_059-01.jpg

:one: 入力データのヘッダ部、明細、フッタ部の各レコードを1づつ抜粋

:two: 入力データのファイルフォーマット

:three: 今回使用するフォーマット定義

赤二重点線の左右でレコードを分けて考えると、3項目になりました。


後は、一つ前の投稿の設定をチョコッと手直しするだけ。

レイアウト情報

今回は、入力側と出力側でフォーマット定義(可変長)を使用します。

フォーマット定義の詳細は以下で紹介しているので、ココでの説明は省略。

入力側のフォーマット定義はこんな感じ :arrow_down:

Qiita_059-02.jpg

全項目を可変長(デリミタ指定)で定義しています。
一覧に出ていない「デリミタ」の設定は、コメントや下図参照で。

Qiita_059-03.jpg

出力側のフォーマット定義はこんな感じ :arrow_down:

Qiita_059-09.jpg

こちらも全項目を可変長(デリミタ指定)で定義しています。
一覧に出ていない「デリミタ」の設定は、コメントや下図参照で。

Qiita_059-10.jpg

出力側の設定は省略(未定義に)できても、入力側の設定は必須のようです。

仮想テーブル

詳しいことはマニュアルで確認していただくとして。

今回は以下の条件で登録します。

1.仮想テーブルファイルに取り込むデータは入力ファイル
2.形式はフォーマット、上記レイアウト情報で登録したIDを使用
3.仮想テーブル名は初期値(VT_TABLE1)
4.[項目取り込み]をクリック

で、登録した定義がこちら :arrow_down:

Qiita_059-04.jpg

データ加工

1.入力ファイルエリアの編集

入力設定

入力ファイルエリアは、シンプルに設定。

形式=フォーマット。上記レイアウト情報で登録した 入力側のID を使用します。

入力データを収めたファイル名を指定して、これ以外の設定は初期値を採用します。

Qiita_059-05.jpg

ちなみに、プレビュー結果はこちら :arrow_down:

Qiita_059-06.jpg

3項目の中で想定通りに納まっています。

ちなみに、仮想テーブルのプレビュー結果も上図と同じになります。

2.出力ファイルエリアの編集

出力設定

出力ファイルエリアも、シンプルに設定。

形式=フォーマット。上記レイアウト情報で登録した 出力側のID を使用します。

出力データを収めるファイル名を指定して、これ以外の設定は初期値を採用します。

Qiita_059-07.jpg

3.抽出条件の設定

今回は、明細のレコードにヘッダ部とフッタ部を連結して出力するので、抽出条件に明細のレコードだけを抽出する条件「入力-項目名(キー)が "M" 」を追加します。

Qiita_059-08.jpg

:warning: 今回は "囲み文字" もデータの一部なので、比較先の値に含めます

4.関係線の設定1〔抽出条件と出力ファイル〕

抽出条件のアイコンを選んで、出力ファイルのアイコンの上にドラッグ&ドロップし、アイコン間の関係線をつなぎます。

5.関係線の設定2〔入力項目と出力項目をマッピング〕

簡単なところから設定していきます。

先ず、読み込んだ明細の項目と出力項目を関係線で結びます。

Qiita_059-11.jpg

続いて出力元が[ヘッダ部(下図赤点線内)][フッタ部(下図緑点線内)]になる項目を編集します。

Qiita_059-12.jpg

これらの項目はすべて〝クエリ値〟で、下図のように設定します。

Qiita_059-13.jpg

SQL文を理解していることが前提なので、クエリ値の説明は不要だと思いますが、上図の顧客IDのクエリ値でやっていることは、

select [3項目目以降] from VT_TABLE1 where [キー] = """H""" AND [請求書番号] = $INUM(1)

VT_TABLE1〔仮想テーブル〕から
[キー] が "H"〔ヘッダ部〕且つ [請求書番号] が $INUM(1)〔入力項目の請求書番号〕と同じレコードの [3項目目以降] を抽出

です。

なので、フッタ部は 赤太字 の [キー] 値を F に変えるだけ。

結構簡単です:wink:

5.データ加工処理

すべての設定が終わったので、 最後にIDを登録して、現在表示されている内容で、データ加工を実行します。

出力結果はこんな感じ :arrow_down:

Qiita_059-14.jpg

各明細にヘッダ部の顧客IDや日付、フッタ部の小計などがくっ付いて、1レコードになって出力されています。

以上です

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?