> ## Documentation Index
> Fetch the complete documentation index at: https://docs.arc.cdata.com/llms.txt
> Use this file to discover all available pages before exploring further.

# EDI 850 発注書をCSV にマッピングする

> CData Arc のマッピングツールを使用して、X12 850 発注書をフラットなCSV ファイルに変換します。

export const siteNameShort = "Arc";

export const siteName = "CData Arc";

## 概要

{siteName} には、EDI 文書（X12、EDIFACT など）をカンマ区切り値（CSV）ファイルのようなフラットファイル構造にマッピングできる強力なデータ変換ツールが含まれています。このガイドでは、X12 850 文書（発注書）をCSV 形式にマッピングすることに焦点を当てます。この記事で説明するアプローチは、他のEDI 文書をマッピングする場合にも適用できますが、マッピングされる値の具体的な関係は異なる場合があります。

このガイドではまず、{siteNameShort} がEDI マッピングをどのように処理するかの概要を説明し、続いてフローの各ステップを順を追って説明します。このガイドで使用するX12 850 のインプットおよびCSV のアウトプット文書については、[サンプル文書](#サンプル文書)を参照してください。

### ビデオリソース

{siteNameShort} のデータ変換の概要については、このビデオをご覧ください。

<iframe width="560" height="315" src="https://www.youtube.com/embed/pQYQ5gH1fC4" frameborder="0" allowfullscreen />

## {siteName} におけるEDI マッピング

### XML との相互変換

{siteNameShort} は、データの変換と操作の中間形式としてXML を使用します。ほとんどのマッピングプロジェクトの最初のステップはソースファイル形式（この場合はX12）をXML に変換することであり、最後のステップはXML をデスティネーション形式（この場合はCSV）に変換することです。

XML との相互変換はデータ変換において非常に重要なステップであるため、{siteNameShort} にはファイルをXML と相互に変換するための専用コネクタが数多く含まれています。このガイドでは、[X12 コネクタ](../connectors/x12)と[CSV コネクタ](../connectors/csv)を使用します。これらのコネクタは、ファイル形式を自動的にXML に変換します。これらのコネクタを使用すると、ソース形式（X12 850 発注書）とデスティネーション形式（必要な列を持つCSV ファイル）をXML としてモデル化できます。

### XML の変換

ソースおよびデスティネーション形式をXML としてモデル化したら、次のタスクは1つのXML 構造を別のXML 構造に変換することです。これは[XML Map コネクタ](../connectors/xml-map/xml-map)によって実現されます。

XML Map コネクタには、開始時と終了時のXML 構造をそれぞれ表すサンプルの**Source** および**Destination** テンプレートファイルが必要です。これらを指定すると、XML Map コネクタのビジュアルデザイナーに2つのXML 構造が表示されます。

XML Map コネクタのビジュアルデザイナーでは、ソース構造の要素をデスティネーション構造の要素にドラッグアンドドロップして、両者の間にマッピング関係を作成できます。このマッピングステップでは、適切な要素がアウトプットファイルに含まれるよう、ソースファイルのデータを理解しておく必要があります。

XML Map コネクタには、マッピングプロセス中にデータを操作・計算するための値フォーマッタ、条件ロジック、さらにはカスタムスクリプトが含まれています。

マッピング関係を作成すると、XML Map コネクタは、ソースXML 構造に一致するすべてのファイルを、デスティネーションXML 構造のファイルに自動的に変換できます。この例では、X12 850 文書のXML モデルがCSV ファイルのXML モデルに自動的に変換されることを意味します。最後のステップは、CSV コネクタを使用してこのXML モデルを実際のCSV ファイルに変換することです。

### 発注書のフラット化

850 発注書をCSV にマッピングする際の具体的な概念上の課題は、発注書を*フラット化*する必要があることです。1つの850 文書には複数の注文を含めることができ、各注文には異なる数の明細項目を含めることができます。一方、CSV ファイルにはこのデータを格納する列が静的な数だけ存在します。

CSV の列数は850 内の可変数の注文に合わせて拡張できないため、850 をCSV ファイルの単一のレコード（行）にマッピングすることはできません。同様に、CSV の列数は注文内の可変数の明細項目に合わせて拡張できないため、注文をCSV ファイルの単一の行にマッピングすることはできません。CSV の各行には、注文内の単一の明細項目のデータを格納する必要があります。単一の明細項目は、850 内の明細項目や注文の数に関わらず、静的な値のセットとして表現できるためです。850 のフラット化とは、その多層的で可変な構造を、静的な明細項目のセットへと縮小することです。

XML Map コネクタは、マッピング中に構造をフラット化するために`Foreach` ループ関係の概念を使用します。この場合、850 内の各明細項目に対して新しいCSV 行が*それぞれ*作成されます。XML Map コネクタでこの関係を確立するには、ビジュアルデザイナーを使用して、ある要素（明細項目を表す`PO1` 要素）を別の要素（CSV レコードを表す要素）にドラッグするだけです。XML Map コネクタで構造をフラット化するのは簡単ですが、適切なForeach 関係を確立できるよう、ソースおよびデスティネーションのXML 構造を理解しておく必要があります。

### まとめ

{siteNameShort} でマッピングを作成するには、次のステップが必要です：

* インプット形式に固有のコネクタ（この例ではX12 コネクタ）を使用して、サンプルのインプットファイル（X12 850 文書など）をXML に変換する
* アウトプット形式に固有のコネクタ（この例ではCSV コネクタ）を使用して、サンプルのアウトプットファイル（必要な列を持つCSV ファイルなど）をXML に変換する
* 結果として得られたXML ファイルを、XML Map コネクタのソースおよびデスティネーションファイルとして使用する
* XML Map コネクタのビジュアルデザイナーで要素をドラッグアンドドロップして、ソースとデスティネーションのXML 構造間の関係を確立する

結果として、X12 文書をインプットとして受け取り、CSV ファイルをアウトプットとして返す自動化されたフローが得られます。

## マッピングフローの作成

このセクションでは、{siteNameShort} で、サンプルの850 発注書をフラットなCSV ファイルにマッピングするフローを作成するために必要な手順を説明します。

### ステップ1：X12 コネクタ

このマッピングフローの最初のステップは、サンプルのソース文書（X12 850）をXML に変換することです。

これは、X12 文書をXML に変換し、変換中にX12 インターチェンジヘッダーをオプションで検証できるX12 コネクタによって実現されます。X12 コネクタの前にはトリガーコネクタ（次の例ではAS2）があり、これがX12 850 文書を受信してX12 コネクタに直接渡します。ユースケースによっては、SFTP など別のトリガーコネクタが必要になる場合があります。ユースケースに合うコネクタの種類の詳細については、[コネクタのカテゴリ](../connectors/connectors#categories)を参照してください。

navbar で**Flows** をクリックし、トリガーコネクタ（この例ではAS2）とX12 コネクタをワークスペースキャンバスに追加します（手順については[フローの設計](../flows/designing-a-flow)を参照してください）。ベストプラクティスは、X12 文書を送信するトレーディングパートナーの名前を**Connector Id** フィールドに含めることです（次の画像ではAmazon）。AS2 とX12 コネクタを接続します。

<img src="https://mintcdn.com/cdata-arc/6KwLqCromZpN96Gn/public/images/edi_csv_1.png?fit=max&auto=format&n=6KwLqCromZpN96Gn&q=85&s=b6becfb820fb3a74fb4c5f1f56414161" alt="ワークスペースキャンバス上のAS2 とX12 コネクタ" width="800" data-path="public/images/edi_csv_1.png" />

#### X12 コネクタの設定

X12 コネクタの[設定タブ](../connectors/x12#settings-tab)で、**Translation Type** を`X12-to-XML` に設定します。これにより、X12 コネクタはX12 文書をXML 形式に変換する際にX12 インターチェンジヘッダーを検証できます（X12 文書が想定されたパーティに送受信されたことを確認するため）。

デフォルトでは、**Dynamically process partners** がチェックされています。これは、コネクタがEDI トランザクションからトレーディングパートナー関係を自動的に識別・追跡することを意味します。この場合、コネクタはライセンスの上限内ですべてのパートナーを動的に管理するため、手動でのパートナー設定は不要です。コネクタは、設定された値に基づいてインターチェンジおよびファンクショナルグループの値も入力します。このガイドではデフォルト設定を使用します。これをオフにした場合に必要となる項目については、[X12 コネクタの設定](../connectors/x12#connector-configuration)を参照してください。

<Note>**Usage Indicator** が`T-Test Data` に設定されている場合、検証は実行されません。</Note>

このガイドの範囲ではこれ以上の設定は不要ですが、特定のユースケースでは必要になる場合があります。詳細については、[X12 のドキュメント](../connectors/x12)を参照してください。

#### テストファイルのアップロード

X12 コネクタのTransactions タブに移動し、**More > Upload Test File** をクリックします。

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/map850-csv_upload_x12_test_file.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=0debfab3040bb119464ca27fe0c57847" alt="X12 コネクタのTransactions タブのUpload Test File オプション" width="700" data-path="public/images/map850-csv_upload_x12_test_file.png" />

マッピングに必要なX12 セグメントを含むサンプルの850 文書を参照します。サンプルのX12 文書を入手するには、トレーディングパートナーに問い合わせる必要がある場合があります。このガイドの作成に使用した850 文書は[こちら](#x12-850)です。

**Upload Test File** は、アップロードした文書のXML モデルを内部に保存するようX12 コネクタに指示します（XML をアウトプットファイルとして**Transactions** タブにプッシュするのではありません）。このXML モデルは、後でXML Map コネクタによって使用されます。

### ステップ2：CSV コネクタ

次のステップは、サンプルのデスティネーション文書（適切な列を持つCSV ファイル）をXML に変換することです。これは、XML とCSV の間でファイルを変換するCSV コネクタを使用して行います。

CSV コネクタのインスタンスをフローに追加します。X12 コネクタには接続**しない**でください。また、ターミナルコネクタ（この例では[File](../connectors/file)）のインスタンスも追加します。これはフローの最後のコネクタとして機能します。CSV とFile コネクタを接続します。

<img src="https://mintcdn.com/cdata-arc/6KwLqCromZpN96Gn/public/images/edi_csv_2.png?fit=max&auto=format&n=6KwLqCromZpN96Gn&q=85&s=5ce70d52825576ce1890353eea11ee5f" alt="ワークスペースキャンバス上のCSV とFile コネクタ" width="800" data-path="public/images/edi_csv_2.png" />

#### CSV コネクタの設定

CSV コネクタの[設定](../connectors/csv#connector-settings)タブを開きます。このマッピングフローに必要なCSV コネクタの設定プロパティは**Column headers present** のみです。マッピングフローによって生成されるCSV ファイルの先頭に列ヘッダー名の行を含める必要がある場合は、これを有効にします。

#### サンプルファイルの生成またはアップロード

CSV コネクタの**Sample Files** タブに移動し、**Add Sample File** をクリックします。適切な列（および**Column headers present** が有効な場合はヘッダー）を含むサンプルCSV ファイルがすでにある場合は、**File Upload** を選択してファイルを参照します。あるいは、**Manually Create** を選択して、アプリケーション内で直接CSV ファイルを作成することもできます。**Manually Create** を選択する場合は、サンプルファイルに名前を付けます。**Next** をクリックします。

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/map850-csv_upload_csv_test_file.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=893a9cc8a6bb325ce7a0dea75551b156" alt="CSV コネクタのAdd Sample File ダイアログ" width="600" data-path="public/images/map850-csv_upload_csv_test_file.png" />

既存のファイルを参照した場合、**View File** タブにその内容が表示されます。ファイルを手動で作成することを選択した場合は、このタブにサンプルデータを入力します。

<img src="https://mintcdn.com/cdata-arc/6KwLqCromZpN96Gn/public/images/edi_csv_4.png?fit=max&auto=format&n=6KwLqCromZpN96Gn&q=85&s=24cc160f7fd23833a87597c0f54bb3e8" alt="サンプルCSV ファイルの内容" width="500" data-path="public/images/edi_csv_4.png" />

**Next** をクリックします。**Translate and Preview** に、サンプルデータをXML に変換したプレビューが表示されます。サンプルに問題がなければ、**Add** をクリックします。

このガイドの作成に使用したCSV ファイルは[こちら](#csv)です。

テストファイルをアップロードすると、CSV コネクタはそのXML モデルを保存します。このXML モデルは次のステップで使用されます。

### ステップ3：XML Map コネクタ

X12 コネクタとCSV コネクタがソースおよびデスティネーション文書のXML モデルを生成したので、XML Map コネクタを使用して一方のXML 構造をもう一方に変換します。

XML Map コネクタのインスタンスをフローに追加し、X12 コネクタをXML Map コネクタに、XML Map コネクタをCSV コネクタに接続します。

<img src="https://mintcdn.com/cdata-arc/6KwLqCromZpN96Gn/public/images/edi_csv_3.png?fit=max&auto=format&n=6KwLqCromZpN96Gn&q=85&s=b795ca15f41eb6e440ade6c1d736cea6" alt="X12、XML Map、CSV コネクタを含む完全なフロー" width="800" data-path="public/images/edi_csv_3.png" />

#### XML Map コネクタの設定

XML Map コネクタの**XML Map** タブでは、コネクタが**Source** をX12 コネクタのテストファイルから、**Destination** をCSV コネクタのサンプルファイルから事前に入力するはずです。

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/map850-csv_visual_designer.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=75b1dee9d6412450e1ffe1c6a7c19374" alt="XML Map コネクタのビジュアルデザイナー" width="800" data-path="public/images/map850-csv_visual_designer.png" />

これらが表示されない場合は、テストファイルが適切にアップロードされていること、およびコネクタがフローキャンバス内で接続されていることを確認してください。マッピングエディタの使用方法の詳細な手順については、[マッピング](../mapping/mapping)のドキュメントの[マッピングの設定](../mapping/mapping-config)を参照してください。

#### XML 構造の理解

XML Map コネクタで正しいマッピング関係を作成するには、ソースおよびデスティネーション構造がXML でどのように表現されているかを理解する必要があります。

構造内のXML 要素（ノード）には2種類あります。*親* ノードと*リーフ* ノードがXML データの階層構造を定義し、親ノードは関連する要素をグループ化し、リーフノードはマッピングされる実際のデータ値を表します。親ノードの横にある展開・折りたたみボタンを使用して、そのリーフを表示または非表示にします。詳細については、[マッピングノード](../mapping/mapping-config#ノードのマッピング)を参照してください。

* 850 XML では、各EDI *ループ* および*セグメント* が親ノードです。各個別のEDI *要素* がリーフノードです。
* CSV XML では、ルートの*Items* 要素の各直接の子は*レコード* 要素と呼ばれ、CSV 内の個別の行を表します。各*レコード* 要素は親ノードであり、*レコード* 要素の子はすべて*列* 要素です。それぞれがレコードの単一のフィールドまたは列を表します。各*列* 要素はリーフノードです。

XML Map コネクタでは、親ノードは他の親ノードにのみマッピングでき、リーフノードは他のリーフノードにのみマッピングできます。EDI をCSV にマッピングする際の主な課題は、（EDI ソースから）正しい*ループ* または*セグメント* 要素を選択して、（CSV デスティネーションの）*レコード* 要素にドラッグすることです。その後、EDI の*要素* ノードを*列* ノードにドラッグして、EDI 文書の特定の値でCSV を埋めることができます。

## マッピングの作成

ソースおよびデスティネーション構造でXML Map コネクタを設定したら、デザイナーでノードをドラッグアンドドロップしてマッピングを作成します。

マッピングは主に2つのステップで作成します：

1. 親ノード間のForeach ループ関係を作成する
2. 確立されたForeach ループ内のリーフノード間で値をマッピングする

ループの操作に関する詳細やその他の例については、[マッピングループ](../mapping/mapping-config#ループのマッピング)を参照してください。

### Foreach ループの作成

Foreach 関係とは、ソースに要素が出現するたびに、デスティネーションに新しいXML 構造が作成されるべきであることを意味します。例えば、ソースの*ElementA* がデスティネーションの*ElementB* にマッピングされている場合、インプットファイル内の*ElementA* の出現ごとに、アウトプットファイルに*ElementB*（および*ElementB* のすべての子）のインスタンスが生成されます。

この場合（[発注書のフラット化](#発注書のフラット化)セクションで説明したとおり）、ソース850 の各明細項目は、デスティネーションCSV の新しいレコードになるはずです。この関係を作成するには、明細項目を表す**Source** 要素を、CSV レコードを表す**Destination** 要素にドラッグします。この場合、ソース要素は*TX-00401-850*、デスティネーション要素は*customers* です：

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/map850-csv_line_item_loop.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=b9db6f26aa0726b3872a465702bf3e12" alt="XML Map コネクタでのForeach ループの作成" width="800" data-path="public/images/map850-csv_line_item_loop.png" />

前の画像に示すように、*customers* デスティネーション要素には、それにマッピングされるソースからのxpath が表示されます。XML パーサーがインプットファイル内でxpath に一致する要素を見つけるたびに、新しい*customers* 要素がアウトプットファイルに追加されます（*customers* 要素に子がある場合は、それらすべてを含みます）。

このForeach ループは、このマッピングに必要な唯一のループです。他のマッピングプロジェクトでは、ネストされたものなど、複数のループが必要になる場合があります。

### リーフノードのマッピング

Foreach 関係を確立したら、ループ内のリーフノードから値をマッピングできます。リーフノードのマッピングは、Foreach ループによって作成されたXML 構造を埋める値を決定します。

#### シンプルなリーフノードのマッピング

ソースの値を結果のアウトプットに直接挿入する場合は、ソースのリーフノードをデスティネーションのリーフノードにドラッグするだけで値がマッピングされます。例えば、*BEG03* 要素は*PONumber* の値を保持し、これはデスティネーションの*PONumber* 属性に対応します：

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/map850-csv_first_leaf_mapping.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=e9cd56fcac0bb659062569749fd69549" alt="PONumber のシンプルなリーフノードマッピング" width="800" data-path="public/images/map850-csv_first_leaf_mapping.png" />

<Note>これらの要素のxpath は、Foreach のxpath を基準とした相対パスです。</Note>

#### Lookahead 構文を使用した条件付きマッピング

850 文書には、交換におけるパーティとそのパーティの役割（例えば、出荷先パーティや請求先パーティ）を表す複数の*N1Loop1* 要素が含まれています。各*N1Loop1* について、*N1Loop1/N1/N104* 要素がパーティを識別する値（パーティ名またはID）を保持するため、これらの値をアウトプットCSV にマッピングする必要があります。しかし、各*N104* 要素のxpath はパーティの役割に関わらず同じであるため、*N104* 要素へのxpath だけでは正しい値をマッピングするのに十分ではありません。

パーティの役割は*N1Loop1/N1/N101* に保持されているため、マッピングでは*N104* 要素の値をアウトプットCSV にマッピングする前に*N101* 要素を参照する必要があります。言い換えると、*BillToPartyCode* は次にマッピングする必要があります：

`N1Loop1/N1/N104 WHERE N1Loop1/N1/N101 = 'BT'`

この条件付きマッピングは、`Lookahead` 構文で実現できます。

まず、値を含む要素をソースからデスティネーション要素（*BillToPartyCode*）にドラッグします：

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/map850-csv_bill_to.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=6df553c1c6dad0cdf3d6172b5553ce60" alt="ソース要素をBillToPartyCode デスティネーションにドラッグ" width="800" data-path="public/images/map850-csv_bill_to.png" />

次に、マッピングされた*BillToPartyCode* 要素にカーソルを合わせ、タブレットと鉛筆のアイコンをクリックして**Node Value** エディタを開きます：

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/map850-csv_bill_to_expression_editor.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=ff277660586523bcc4b0a16e32bf73d9" alt="BillToPartyCode のNode Value エディタ" width="800" data-path="public/images/map850-csv_bill_to_expression_editor.png" />

現在マッピングされているxpath が*N1Loop1/N1/N104* であり、参照するxpath が*N1Loop1/N1/N101* であることに注目してください。Lookahead 構文は次のように指定します：

* 現在のxpath の中で、参照する要素の最も近い親である要素（この場合は*N1* 要素）を見つける
* 角括弧`[ ]` の中に、参照する要素へのxpath（この場合は`[N101]`）を指定する
* 等号式`=` を追加して、この要素を照合する値（この場合は`BT`）を示す
* 角括弧がxpath 式の一部として評価されないよう、バックスラッシュでエスケープする

結果として得られるLookahead 式を以下に示します：

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/map850-csv_bill_to_lookahead.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=162097d339fef4478f07d6581192059d" alt="BillToPartyCode のLookahead 式" width="800" data-path="public/images/map850-csv_bill_to_lookahead.png" />

残りのデスティネーション要素についても同じプロセスを繰り返します。

#### Node Value エディタによる値の変更と計算

Node Value エディタは、xpath の操作に加えて、マッピング中に値を変更・操作する[フォーマッタ](../scripting/value-formatters/formatters)をサポートしています。*ItemTotalCost* 要素は明細項目の合計コストにマッピングする必要がありますが、これはソース要素から直接得られるものではなく、項目の数量と項目の価格を掛けることで簡単に計算できます。

開始点として、項目の価格を*ItemTotalCost* 要素にマッピングし、Node Value エディタを開きます。

*multiply* フォーマッタを使用して、この開始値（項目あたりの価格）に項目数を掛けることができます。フォーマッタ構文は次のように機能します：

* シーケンスは角括弧で囲まれます（現在の*ItemTotalCost* 式ですでにそうなっています）
* シーケンスは左から右へ評価されます
* シーケンスは縦のパイプ文字で区切られます（例：`[value | formatter1() | formatter2() | formatter3()]`）

<Note>ソースノードをデスティネーションノードにドラッグした結果生成される*xpath()* 構文自体が、特別な種類のフォーマッタです。</Note>

xpath 式の右端（閉じ角括弧の内側）に縦のパイプ区切り文字を追加して、フォーマッタ用の新しいスペースを作成します。このスペースに、*multiply()* フォーマッタを手動で入力するか、Node Value エディタの**Formatters** タブに移動し、「multiply」を検索して、該当するフォーマッタをクリックして式に追加します。開始値（項目の価格）に項目の数量を掛けるには、項目の数量の値を*multiply* フォーマッタのパラメータとして指定する必要があります。この値はインプットの850 から取得する必要があるため、項目の数量に対応するxpath（*PO1/PO2*）を使用した別の*xpath* 式が必要です：

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/map850-csv_total_cost_multiply.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=8e8582150f6b4c5622739909d47cdfbb" alt="ItemTotalCost のmultiply フォーマッタ式" width="700" data-path="public/images/map850-csv_total_cost_multiply.png" />

結果として得られる式は、項目あたりのコストに項目の数量を掛けることで、明細項目の合計コストを正しく計算します。

式を保存すると、マッピングは完了です。XML Map コネクタへの変更を保存すれば、完全なフローの設定が完了です。

## サンプル文書

このガイドの作成には、次のサンプルデータを使用しました。

### X12 850

```text theme={null}
ISA*00*          *00*          *ZZ*AMAZONDS       *01*003025392      *160623*1448*U*00401*000000013*0*P*+~
GS*PO*AMAZONDS*ATFDS*20070911*2001*95*X*004010~
ST*850*0003~
BEG*00*DS*TesT0008516**20070805~
CUR*BT*USD~
N1*BT*Amazon.com.kydc,Inc.*92*KYDC~
N1*SF*WHSE*92*WHSE~
N1*ST*Charlie Dinkins~
N3*11254 Main St*Suite 112~
N4*Seattle*WA*98104*US*CC*United States~
TD5**92*UPS_GR_RES****ZZ*RES~
N1*LW*Amber Baker~
N3*123 Anderson Avenue~
N4*Seattle*WA*98103*US~
PO1*1*3*EA*18.04*NT*SK*1617*****BL*1*ZZ*Amazon.com~
PO1*2*2*EA*54.42*NT*SK*4927*****BL*1*ZZ*Amazon.com~
PO1*3*1*EA*18*NT*SK*9876*****BL*1*ZZ*Amazon.com~
CTT*3*6~
SE*15*0003~
GE*1*40~
IEA*1*000000040~
```

### CSV

```csv theme={null}
CustomerId,PONumber,PODate,BillToPartyCode,ShipFromCode,ShipToAddress,ShipToCity,ShipToZIP,LineItemNumber,ItemID,ItemQuantity,ItemPrice,ItemTotalCost
Sir Charles,128F195,20190805,AbRes,W22,2408 Creek St,Springfield,52213,1,BouncyRubberBall,4,2.49,9.96
Lady Jane,128F196,20190805,AbRes,W22,2408 Creek St,Springfield,52213,2,SquishyNerfBall,2,4.29,8.58
```
