回答編集履歴

1

追記

2022/07/11 02:01

投稿

退会済みユーザー
test CHANGED
@@ -12,3 +12,77 @@
12
12
  今は CSV ファイルは Shift_JIS になっているとか? だとすると、Shift_JIS に無い文字が使われているので、ファイルの中身が既に文字化け状態です。
13
13
 
14
14
  文字化けしているのを StreamReader が読んでくるので、そのまま文字化けで出力されるというのが現状ではないのですか?
15
+
16
+ ---
17
+
18
+ **【追記】**
19
+
20
+ 上に書いた (1), (2) に沿った例を追記しておきます。
21
+
22
+ (1) CSV のフィールドにカンマが含まれる場合、フィールドをダブルクォート(")で囲む。
23
+
24
+ 以下の画像のように [rɪvóʊk, rɪvˈəʊk] と [vάɪəlèɪt, ˈvaɪʌleɪt] を " で囲います。文字コードは BOM なしの UTF-8 にしておきます(メモ帳のデフォルト)。
25
+
26
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-07-11/4235318c-8f30-4d1b-b7d7-901ac824c16c.jpeg)
27
+
28
+ (2) 文字コードをきちんと考える
29
+
30
+ アプリで CSV ファイルを読むときは UTF-8 で、コンソールに出力する時はデフォルトの CodePage ではなく Unicode とします (CodePage = 日本語 OS では Shift_JIS に含まれない文字があるので)。
31
+
32
+ コンソールの Unicode サポート
33
+ https://docs.microsoft.com/ja-jp/dotnet/api/system.console?view=net-6.0#unicode-support-for-the-console
34
+
35
+
36
+ サンプルコードを以下に載せておきます。.NET 6.0 のコンソールアプリです。上の (1) のような CSV ファイルの処置が可能なパーサーを自力でコーディングするのは簡単ではありませんので、既存のパーサー TextFieldParser を使っています。
37
+
38
+ TextFieldParser クラス
39
+ https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.fileio.textfieldparser?view=net-6.0
40
+
41
+
42
+ ```
43
+ using Microsoft.VisualBasic.FileIO;
44
+ using System.Text;
45
+
46
+ string path = @"C:\Users\surfe\Documents\Visual Studio 2022\Net6App\ConsoleAppCsv\ConsoleAppCsv\CsvFile1.csv";
47
+
48
+ // CSV ファイルが UTF-8 なので第 2 引数に Encoding.UTF8 を設定
49
+ using (var parser = new TextFieldParser(path, Encoding.UTF8))
50
+ {
51
+ var list = new List<List<string>>();
52
+
53
+ //フィールドがデリミタで区切られている
54
+ parser.TextFieldType = FieldType.Delimited;
55
+ // デリミタを , とする
56
+ parser.Delimiters = new string[] { "," };
57
+ // フィールドを " で囲み、改行文字、デリミタを含めることができるか
58
+ parser.HasFieldsEnclosedInQuotes = true;
59
+ // フィールドの前後からスペースを削除
60
+ parser.TrimWhiteSpace = true;
61
+
62
+ while (!parser.EndOfData)
63
+ {
64
+ string[]? fields = parser.ReadFields();
65
+ if (fields != null)
66
+ {
67
+ list.Add(fields.ToList());
68
+ }
69
+ }
70
+
71
+ // コンソールに出力する時はデフォルトの CodePage ではなく Unicode
72
+ // とします (CodePage = 日本語 OS では Shift_JIS に含まれない文字
73
+ // があるので)
74
+ Console.OutputEncoding = Encoding.Unicode;
75
+
76
+ foreach (List<string> line in list)
77
+ {
78
+ foreach (string field in line)
79
+ {
80
+ Console.WriteLine(field);
81
+ }
82
+ }
83
+ }
84
+ ```
85
+
86
+ 実行結果は以下の通りです。
87
+
88
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-07-11/9c8085c2-33f6-4882-9970-b7c3db46691a.jpeg)