知識マップ: CSVは「ただのテキスト」ではない ── C#業務アプリのCSV実務(文字コード・Excel互換・インジェクション対策)
記事「CSVは「ただのテキスト」ではない ── C#業務アプリのCSV実務(文字コード・Excel互換・インジェクション対策)」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
この記事は業務アプリでのCSV入出力を、事実上の標準であるRFC 4180を軸に整理します。String.Splitによる自作パースはフィールド内のカンマや改行を処理できないため推奨されず、.NET標準のTextFieldParserやライブラリのCsvHelperがその代替として位置づけられます。文字コードはBOM付きUTF-8がExcelでの文字化けを防ぐ一方、システム間連携ではBOMなしUTF-8が使われ、.NET(Core)でShift_JISを扱うにはCodePagesEncodingProviderの登録が前提になります。ExcelはCSVの値を数値や日付として解釈するため先頭ゼロ落ちや日付化が起き、これを避けたい場合はxlsx出力が有効です。ユーザー入力を出力するアプリでは、数式解釈を悪用するCSVインジェクションへの対策として先頭文字の無害化が必要になります。
flowchart LR
accTitle: CSVファイル処理の知識マップ
accDescr: CSVがRFC 4180を前提とすること、Split自作パースが非推奨でTextFieldParserやCsvHelperが代替になること、BOMの有無がExcelでの文字化けとCSVインジェクション対策・xlsx出力の使い分けに関わることを示す図
csv["CSV(カンマ区切り値)"]
textfieldparser["TextFieldParser"]
rfc_4180["RFC 4180"]
string_split_csv_parsing["String.Split(',')による自作CSVパース"]
csvhelper["CsvHelper"]
excel["Excel"]
excel_csv_value_interpretation["ExcelによるCSV値の解釈(先頭ゼロ落ち・日付化・指数表記)"]
xlsx_output["xlsx出力"]
csv_injection["CSVインジェクション"]
csv_injection_sanitization["数式先頭文字の無害化(CSVインジェクション対策)"]
shift_jis["Shift_JIS"]
codepages_encoding_provider["CodePagesEncodingProvider"]
dotnet[".NET(Core以降)"]
bom["BOM(Byte Order Mark)"]
utf8_bom_encoded["BOM付きUTF-8"]
utf8_no_bom["BOMなしUTF-8"]
csv_mojibake["CSVの文字化け"]
utf8encoding_class["UTF8Encodingクラス"]
streaming_csv_read["CSVのストリーミング読み込み"]
invariant_culture["CultureInfo.InvariantCulture"]
csv -.->|"前提とする"| rfc_4180
string_split_csv_parsing -->|"用いるのは非推奨"| csv
textfieldparser -->|"実装を担う"| rfc_4180
textfieldparser -->|"推奨される対応"| csv
csvhelper -.->|"推奨される対応"| csv
csvhelper -->|"実装を担う"| rfc_4180
csvhelper -.->|"の後継"| textfieldparser
excel -->|"原因になり得る"| excel_csv_value_interpretation
xlsx_output -.->|"防止する"| excel_csv_value_interpretation
xlsx_output -.->|"推奨される対応"| excel
csv -.->|"原因になり得る"| csv_injection
csv_injection_sanitization -->|"軽減する"| csv_injection
shift_jis -.->|"前提とする"| codepages_encoding_provider
dotnet -.->|"前提とする"| codepages_encoding_provider
bom -.->|"に保存される"| csv
utf8_bom_encoded -->|"推奨される対応"| excel
utf8_no_bom -.->|"用いるのは非推奨"| excel
utf8_no_bom -.->|"原因になり得る"| csv_mojibake
utf8_bom_encoded -->|"防止する"| csv_mojibake
bom -->|"で構成できる"| utf8encoding_class
textfieldparser -->|"推奨される対応"| streaming_csv_read
invariant_culture -->|"推奨される対応"| csv
excel -->|"利用する"| csv
csv -.->|"利用する"| shift_jis
概念間の関係(全24件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- CSV(カンマ区切り値)はRFC 4180を前提とします。
- String.Split(',')による自作CSVパースをCSV(カンマ区切り値)に用いることは推奨されません。
- TextFieldParserはRFC 4180の実装を担います。
- TextFieldParserはCSV(カンマ区切り値)に対する本記事の推奨です。
- CsvHelperはCSV(カンマ区切り値)に対する本記事の推奨です。
- CsvHelperはRFC 4180の実装を担います。
- CsvHelperはTextFieldParserの後継に当たります。
- ExcelはExcelによるCSV値の解釈(先頭ゼロ落ち・日付化・指数表記)の原因になることがあります。
- xlsx出力はExcelによるCSV値の解釈(先頭ゼロ落ち・日付化・指数表記)を防ぎます。
- xlsx出力はExcelに対する本記事の推奨です。
- CSV(カンマ区切り値)はCSVインジェクションの原因になることがあります。
- 数式先頭文字の無害化(CSVインジェクション対策)はCSVインジェクションを軽減します。
- Shift_JISはCodePagesEncodingProviderを前提とします。
- .NET(Core以降)はCodePagesEncodingProviderを前提とします。
- BOM(Byte Order Mark)はCSV(カンマ区切り値)に保存されます。
- BOM付きUTF-8はExcelに対する本記事の推奨です。
- BOMなしUTF-8をExcelに用いることは推奨されません。
- BOMなしUTF-8はCSVの文字化けの原因になることがあります。
- BOM付きUTF-8はCSVの文字化けを防ぎます。
- BOM(Byte Order Mark)はUTF8Encodingクラスで構成できます。
- TextFieldParserはCSVのストリーミング読み込みに対する本記事の推奨です。
- CultureInfo.InvariantCultureはCSV(カンマ区切り値)に対する本記事の推奨です。
- ExcelはCSV(カンマ区切り値)を利用します。
- CSV(カンマ区切り値)はShift_JISを利用します。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。