MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
C Sharpの基礎 - CSVファイルのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
C Sharpの基礎 - CSVファイル
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == CSV (Comma-Separated Values) は、テキストベースのシンプルなファイル形式である。<br> 各行がデータレコードを表しており、フィールドはカンマ (または他の区切り文字) で区切られている。<br> <br> C#でCSVファイルを読み込む場合は、主に<code>System.IO</code>名前空間のクラスを使用する。<br> <code>File.ReadAllLines</code>メソッドを使用してファイルの全行を文字列配列として読み込み、次に、<code>String.Split</code>メソッドで各行をフィールドに分割する。<br> <br> CSVファイルへ書き込む場合は、<code>StreamWriter</code>クラスを使用して行うことができる。<br> 各フィールドをカンマで連結して、<code>WriteLine</code>メソッドで1行ずつファイルに書き込む。<br> <br> より複雑なCSV操作には、サードパーティのライブラリを利用することも可能である。<br> CsvHelperライブラリは人気のあるライブラリであり、読み書きの柔軟性が高く、大規模なCSVファイルの処理に適している。<br> <br> CSVファイルを扱う時の注意点として、フィールド内にカンマが含まれる場合の処理がある。<br> このような場合、フィールドを引用符で囲むなどの対策が必要である。<br> <br> また、文字エンコーディングの問題にも注意が必要であり、特に異なる言語や地域のデータを扱う場合は重要である。<br> <br> C#のLINQを活用すると、CSVデータの効率的な操作や分析が可能になる。<br> 例えば、特定の条件に合うレコードのフィルタリング、あるいは、データの集計等を簡単に行うことができる。<br> <br> セキュリティの観点からは、外部ソースからのCSVファイルを扱う場合には注意が必要である。<br> 悪意のあるデータが含まれている可能性があるため、適切な入力検証とサニタイズを行うことが重要である。<br> <br> パフォーマンスを考慮する場合、大規模なCSVファイルを扱う場合はストリーミング読み取りを検討する。<br> これにより、メモリ使用量を抑えつつ効率的に処理を行うことができる。<br> <br><br> == TextFieldParserクラス == CSVファイルを読み込むには、.NET Framework 2.0で追加された<code>TextFieldParser</code>クラス(<code>Microsoft.VisualBasic.FileIO</code>名前空間)を使用する。<br> <code>TextFieldParser</code>クラスを使用することで、CSVファイルを読み込み、各行の各フィールドの文字列を簡潔に取得することができる。<br> <br> <code>TextFieldParser</code>クラスは、<code>Microsoft.VisualBasic.FileIO</code>名前空間に含まれているため、<br> C#で使用する場合は、一般的に、Microsoft.VisualBasic.dllファイルへの参照を追加する必要がある。<br> <br> <u>※注意</u><br> <u>このクラスはVisual Basicのライブラリの一部であるため、C#で使用する場合は追加の依存関係が生じることに注意する。</u><br> <br> ==== RFC 4180との関係 ==== TextFieldParserクラスは多くのRFC 4180の要件を満たしている。 ただし、いくつかの点で完全な準拠ではない。 <br> * 準拠している点 ** カンマで区切られたフィールドの処理 ** 引用符で囲まれたフィールド内のカンマの処理 ** 改行文字を含むフィールドの処理 *: <br> * 部分的に準拠している点 ** 引用符の扱い **: <code>TextFieldParser</code>クラスは引用符の使用を柔軟に設定できるが、デフォルトの動作がRFC 4180と完全に一致するわけではない。 *: <br> * 準拠していない可能性がある点 ** ヘッダ行の特別な扱い **: RFC 4180はヘッダ行について言及しているが、<code>TextFieldParser</code>クラスにはヘッダ行を自動的に識別する機能がない。 ** 厳密なCRLF改行の要求 **: RFC 4180はCRLF (\r\n) を改行として指定しているが、<code>TextFieldParser</code>クラスはより柔軟である。 <br> 以下の例では、<code>TextFieldParser</code>クラスを使用して、RFC 4180の仕様に近づけている。<br> <syntaxhighlight lang="c#"> using Microsoft.VisualBasic.FileIO; using (TextFieldParser parser = new TextFieldParser("sample.csv")) { parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(","); parser.HasFieldsEnclosedInQuotes = true; // RFC 4180に準拠するため // ヘッダ行の処理 string[] headers = parser.ReadFields(); while (!parser.EndOfData) { string[] fields = parser.ReadFields(); // フィールドの処理を行う } } </syntaxhighlight> <br> ==== CSVファイルの読み込み ==== ===== エンコーディングの指定 ===== <code>TextFieldParser</code>クラスを使用してCSVファイルを読み込むには、<br> まず、<code>TextFieldParser</code>クラスのコンストラクタに処理するCSVファイルを指定して、インスタンスを生成する。<br> <br> CSVファイルに日本語が含まれている場合は、文字コードを指定する。<br> <syntaxhighlight lang="c#"> using System.Text; using Microsoft.VisualBasic.FileIO; var parser = new TextFieldParser(@"hoge.csv", Encoding.GetEncoding("Shift_JIS")); // Shift-JISを指定 </syntaxhighlight> <br> ===== デリミタの指定 ===== デリミタを指定する場合は、<code>TextFieldType</code>プロパティに<code>FieldType.Delimited</code>を指定する。<br> <br> <code>SetDelimiters</code>メソッドを使用して、区切り文字を指定する。(複数の区切り文字が指定可能)<br> CSVファイルの場合は、<code>,</code>(カンマ)を指定する。<br> <br> また、<code>FieldType.FixedWidth</code>を指定する場合、フィールドが固定幅のファイルも扱うことができる。<br> <br> <syntaxhighlight lang="c#"> parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(","); // 区切り文字はカンマを指定する </syntaxhighlight> <br> ===== レコードの取得 ===== <code>TextFieldParser</code>クラスの<code>ReadFields</code>メソッドを実行するごとに、CSVファイルを1行ずつ読むことができる。<br> <code>ReadFields</code>メソッドは、読み込んだレコードの全てのフィールドを文字列配列に変換して返す。<br> <br> 次のレコードが存在するかどうかは<code>EndOfData</code>プロパティにより判定できるため、繰り返し文を使用してCSVファイル全体を処理する。<br> <syntaxhighlight lang="c#"> while (!parser.EndOfData) { // 配列rowの要素は読み込んだレコードの各フィールドの値 string[] row = parser.ReadFields(); // 1レコード読み込む } </syntaxhighlight> <br> ===== 使用例 ===== 以下の例では、hoge.csvファイルを読み込み、各フィールドを切り出してタブ区切りで画面に出力する。<br> 改行文字および空白文字がどのように処理されるかを分かりやすくするために、それぞれをnと_に置換して出力している。<br> <br> * <code>HasFieldsEnclosedInQuotes</code>プロパティ *: フィールドに改行やデリミタを含める為に引用符を使っているようなフォーマットを考慮する場合は、 *: <code>HasFieldsEnclosedInQuotes</code>プロパティを<code>true</code>に設定する。(初期値はtrue) *: <br> * TrimWhiteSpaceプロパティ *: フィールドの前後の空白文字を削除しない場合は、<code>TrimWhiteSpace</code>プロパティを<code>false</code>に設定する。(デフォルトは、true) <br> <syntaxhighlight lang="c#"> using System; using System.Text; using Microsoft.VisualBasic.FileIO; class CSVParser { static void Main() { using (var parser = new TextFieldParser("text.csv", Encoding.GetEncoding("Shift_JIS"))) { parser.TextFieldType = FieldType.Delimited; // フィールドはデリミタにより区切る(可変) parser.Delimiters = new[] {","}; // 区切り文字を指定 parser.CommentTokens = new[] {"#"}; // #で始まる行をコメントとする // parser.HasFieldsEnclosedInQuotes = false; // 引用符で括られたフィールドを持つか指定 // parser.TrimWhiteSpace = false; // フィールドの前後に含まれる空白を削除するか指定 while (!parser.EndOfData) { try { string[] row = parser.ReadFields(); // 1行読み込む foreach (string field in row) { field = field.Replace("\r\n", "n"); // 改行をnに置換 field = field.Replace(" ", "_"); // 空白を_に置換 Console.Write(field + "\t"); // タブ区切りで出力 } Console.WriteLine(); } catch(Exception ex) { Console.WriteLine(ex.Message); } } } } } </syntaxhighlight> <br><br> __FORCETOC__ [[カテゴリ:C_Sharp]]
C Sharpの基礎 - CSVファイル
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse