🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

11143閲覧

ダブルクォーテーション内のカンマを判定しないようにしたいです。

AEGIL

総合スコア7

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/12/18 10:53

編集2020/12/18 21:06

質問内容
ダブルクォーテーション内のカンマを判定してしまい行がずれてしまいます。
調べたのですが、動作が行われなかったので初歩的なことだと思いますが、回答お願い致します。
下記のコードを実行しています。

c#

1 using (TextFieldParser parser = new TextFieldParser(csvFilePath, encoding)) 2 { 3 //カンマ区切りのcsv形式にする 4 parser.TextFieldType = FieldType.Delimited; 5 parser.Delimiters = new string[] { "," }; 6 //ダブルクォーテーションを判定 7 parser.HasFieldsEnclosedInQuotes = true; 8 //ダブルクォーテーション内のカンマを飛ばす 9 parser.TrimWhiteSpace = false; 10 //最後まで繰り返す 11 while (!parser.EndOfData) 12 { 13              string[] fields = parser.ReadFields(); 14 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/12/18 10:57

そのカンマの行の内容を提示しましょう
YAmaGNZ

2020/12/18 11:05

どのようなデータを入力してどのように確認されたのですか?
退会済みユーザー

退会済みユーザー

2020/12/18 11:10

> 調べたのですが、動作が行われなかったので初歩的なことだと思いますが、回答お願い致します。 それよりなにより、質問をする際の「初歩的」なことが何か認識しましょう。
Orlofsky

2020/12/18 12:25

ワックスをダブルコーティングした、などと言うように、「コーティング coating」は「塗る」、って意味。 ダブルクォーテーション・マーク double quotation mark でくくる "文字列" ことをダブルクォーティング double quoting という。 また、シングクォーテーション・マーク single quotation mark でくくる '文字列' ことをシングルクォーティング single quoting という。 外資系で作業すると話が通じないことがあるので、質問を修正しては?
AEGIL

2020/12/18 22:05

ご指摘ありがとうございます。。質問に関して訂正いたしました。
guest

回答3

0

ベストアンサー

回答ではありません。
貴方が提示したコード(値の出力部分など追記してありますが、根本部分は変更していません。)

C#

1using (TextFieldParser parser = new TextFieldParser(@"C:\test\test.csv", System.Text.Encoding.GetEncoding("SHIFT-JIS"))) 2{ 3 //カンマ区切りのcsv形式にする 4 parser.TextFieldType = FieldType.Delimited; 5 parser.Delimiters = new string[] { "," }; 6 //ダブルコーテーションを判定 7 parser.HasFieldsEnclosedInQuotes = true; 8 //ダブルコーテーション内のカンマを飛ばす 9 parser.TrimWhiteSpace = false; 10 11 int index = 1; 12 //最後まで繰り返す 13 while (!parser.EndOfData) 14 { 15 string[] fields = parser.ReadFields(); 16 17 Console.WriteLine($"{index++}行目:1項目目={fields[0]}:2項目目={fields[1]}:3項目目={fields[2]}"); 18 19 } 20}

入力したCSV
3行目と4行目にダブルクォーテーションで囲いカンマを入れてあります。
4行目は改行も含むデータとしています。

CSV

1aaa,aaa,aaa 2bbb,"bb",bbb 3ccc,"cc,cc",ccc 4ddd,"dd,dd 5dd",ddd 6eee,eee,eee

結果

1行目:1項目目=aaa:2項目目=aaa:3項目目=aaa 2行目:1項目目=bbb:2項目目=bb:3項目目=bbb 3行目:1項目目=ccc:2項目目=cc,cc:3項目目=ccc 4行目:1項目目=ddd:2項目目=dd,dd dd:3項目目=ddd 5行目:1項目目=eee:2項目目=eee:3項目目=eee

3行目の2つ目の項目は正しく「cc,cc」となっています。
4行目の2つ目の項目は正しく「dd,dd\ndd」(\nは改行)となっています。
ダブルクォーテーションで囲まれた部分は正しく処理され、行がずれる等の現象は確認できません。

どのようなCSVを読み込み、結果がどうなるか提示してください。

投稿2020/12/18 14:32

YAmaGNZ

総合スコア10469

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AEGIL

2020/12/18 21:59 編集

ご回答ありがとうございます。簡易的なcsvファイルで改めて試してみたのですが、しっかり実行はできました。 しかし、linqを用いてcsvとoracle結合して実行するとなんらかのデータのズレがあるようなのでもう少し自分で原因を考えてみます。お忙しい中ご回答いただきありがとうございます。
AEGIL

2020/12/18 22:19

追加でお伺いしたいのですが、writerで出力する時も同じ処理をしないと列のズレが生じるのでしょうか。
YAmaGNZ

2020/12/18 23:09

書き出す処理は全く別の話です。 ただ単に書き出したCSVが間違っているのでしょう。
AEGIL

2020/12/21 02:31

なるほど。ご回答ありがとうございます。
guest

0

  • 質問コードをほぼそのまま .Net Core の Console App でプロジェクト作って下記を実行したら、クォート内の , では分割されていないように見えたので、何かの思い違いじゃないでしょうか。

csharp

1using System; 2using System.IO; 3using Microsoft.VisualBasic.FileIO; 4namespace ConsoleApp 5{ 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 using (TextFieldParser parser = new TextFieldParser(new StringReader(@"""a,1"",""b"",""c"""))) 11 { 12 //カンマ区切りのcsv形式にする 13 parser.TextFieldType = FieldType.Delimited; 14 parser.Delimiters = new string[] {","}; 15 //ダブルコーテーションを判定 16 parser.HasFieldsEnclosedInQuotes = true; 17 //ダブルコーテーション内のカンマを飛ばす 18 parser.TrimWhiteSpace = false; 19 //最後まで繰り返す 20 while (!parser.EndOfData) 21 { 22 string[] fields = parser.ReadFields(); 23 Console.WriteLine(string.Join(" <> ", fields)); 24 /* 25 * a,1 <> b <> c 26 */ 27 } 28 } 29 } 30 } 31}

投稿2020/12/18 14:33

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2020/12/18 14:35

かぶりまけしましたね。
AEGIL

2020/12/18 22:01

ご回答ありがとうございます。簡易的なcsvファイルを用意して実行するとやはり、上記のコードがしっかり動いているようなので他に原因があるのかと思われます。今一度確認しなおしてみます。お忙しい中ご返答ありがとうございます。
guest

0

こんばんは。
単純にカンマでスプリットすると、ダブルクォーテーション内のカンマもスプリットしてしまいます。
前回のカンマから次のカンマまでにダブルクォーテーションが偶数回含まれていればダブルクォーテーションは閉じていると判定することも可能です。
また、むしろこのような判定を細かくするのではなく、正規表現を使って解析したほうが早いかもしれません。正規表現を用いた方法についてはこちらのページが参考になります。
お役に立てれば幸いです。

投稿2020/12/18 13:35

mtripg6666tdr

総合スコア37

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mtripg6666tdr

2020/12/18 14:45 編集

すみません、そもそもTextFieldParser使ってましたし、この回答、根本的に違いましたね...申し訳ないです。
AEGIL

2020/12/18 21:52

ご回答ありがとうございます。詳細説明できていないのにありがとうございます。確認したところやはり動いてはいるようなので他の原因があるのかもしれません。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問