2011-01-18 10 views
5

次のような行を含むCSVファイル(私は設計していないので変更できません。変更することもできません):データにカンマが含まれている場合、コンマで区切る文字列

"Surname, Firstname", yes, no, somestring, whatever, etc

あなたがここに見ることができるように、最初の,は、私は、文字列を分割したいと思いますどのカンマではありません。この特定のカンマは引用符で囲まれています。このため

、それは代わりに6

の上記の文字列のために私に長さ7の配列を与えるだろうと明らかにstring.split(',')簡単で、動作しませんが、この問題を回避する方法はありますか?私は代わりに文字列を分割するために正規表現を使用することを考えていましたが、正規表現では引用符で囲まれていないコンマで区切られるパターンを考えるのは十分ではありません。

私はcharで各文字列charを読み込むことで醜い、ハックな方法を考えることができますが、これはもっと良い方法があると確信しているので、これは最後の手段でなければなりません!

+0

これはExcelの.csvのようです。常に楽しい。より楽しいのは、データに引用符とカンマが含まれている場合です。 –

+0

実際にはExcelではありませんが、楽しいですよ! :)それはネット上の場所から来たもので、私のプログラムはファイルを読み込み、それを解析しようとします。 – AndrewC

+1

一度に1文字を読むことは必ずしも醜いハックではありません。私はC#CSVパーサを見つけることをお勧めします。 –

答えて

1

ここで、文字ごとの比較は決して使用されるべきではないと私は強く反対すると思いますが、私はMicrosoftのような企業だけがそうするべきではないと確信していますプログラミングの一種。

Afterallでは、Splitは文字ごとの比較を行うので、あなたが望むものとまったく同じでない既存のコードを呼び出すと、なぜそれほど醜いのですか?

いずれにせよ、私のアプローチは自分のコードを書くことでした。そして私はコードをhttp://www.blackbeltcoder.com/Articles/files/reading-and-writing-csv-files-in-cにオンラインで掲載しました。

+0

ありがとうジョナサン。私はあなたのコードを使用する方法についてちょっと混乱していますが、私はなぜReadRow()にパラメータを渡す必要があるのか​​分かりません。 – AndrewC

+0

パラメータには読み込まれたデータが入力されます。 –

+0

完璧に作業しました!ありがとうジョナサン。 – AndrewC

5

これは簡単にTextFieldParser classを使用して処理できます。ただHasFieldsEnclosedInQuotesをtrueに設定してください。

+0

これはC#の質問として投稿されたときに、.NET 4.5のビジュアルベーシッククラスを参照しています。 – aggaton

+2

@aggaton型がMicrosoft.VisualBasic名前空間にあるという理由だけで、C#から使用できないというわけではありません。 'TextFileParser'はC#からうまく機能し、それはコアフレームワークの一部です - それを避ける理由はありません。 –

+0

@ReedCopsey 'TextFileParser'ではなく、' TextFieldParser'です。あなたは正しいことに結びついていましたが、一貫してそれを間違って書きました。 – Nyerguds

2

CSVパーサーライブラリを使用することをお勧めします。引用されたフィールドの一部として新しい行が考えられない場合があります。

VisualBasic名前空間には便利なライブラリがあります - TextFieldParser

+1

C#devsはVisualBasic名前空間について心配するべきではありません。何も意味しないIRL、マシンにない依存関係などを追加しません。 – Will

+0

C#で使用すると、美しく、@が言ったように、うまく動作します。なぜ、Microsoftはこのような奇妙な場所でこのようなツールを隠すのでしょうか? – Nyerguds

関連する問題