プロが教える店舗&オフィスのセキュリティ対策術

TextFieldParserクラスによるCSVファイルの読み込みを試してみました。
http://www.atmarkit.co.jp/fdotnet/dotnettips/487 …
すげー便利と思いましたが、
セル内で空行が圧縮される現象が起きました。
解決方法はありませんか?


例は項目が2つの1レコードのデータで、item2に複数行データが入っています。

==エディタでの見た目==
item1,item2
"aaa","
abc
defg

h

ijklmn
"
==エディタでの見た目==


==仮に改行を視覚化すると==
item1,item2{cr}{lf}
"aaa","{lf}abc{lf}defg{lf}{lf}h{lf}{lf}ijklmn{lf}"
==仮に改行を視覚化すると==

これを読み込むと、
"defg"と"h"の間と、
"h"と"ijklmn"の間の改行がどこかに行ってしまいました。

==エディタでの見た目==
item1,item2
"aaa","
abc
defg
h
ijklmn
"
==エディタでの見た目==

そういう仕様なのでしょうか?

A 回答 (2件)

> 余計な事をオプションではなく、強制的にやってしまうのは作った人が意地悪なのか、まともな物を作って提供するとサードパーティから物言いが付くとか、単にセンスが無いだけなのか、どちらにしても残念な事です。



元々,TextFieldParserは簡易データベースとしての読み込みを想定しているのだと思います。
そのため,空行自体はレコードとして意味をなさず,読み飛ばしているのだと思います。


> 代替的な方法何かありませんか?

自分で用意するのがよいでしょう。
DOBON.NETさんのページも参考になると思います。
site: CSV形式のファイルをDataTableや配列等として取得する: .NET Tips: C#, VB.NET, Visual Studio
http://dobon.net/vb/dotnet/file/readcsvfile.html

> あと、実装コードは簡単にみる事ができますか?
> Trim結果が空の場合に行を省く部分だけ取り除いた物を別の名前で自作するとか簡単にできるでしょうか?

実装コードは
site: .NET Framework Libraries
http://referencesource.microsoft.com/netframewor …
からダウンロードすることができますし,
site: Visual Studio 2008で見る.NET Frameworkのソースコード - @IT
http://www.atmarkit.co.jp/fdotnet/insiderseye/20 …
にあるように,ステップインも可能です。
ただし,.NET Framework 3.5 SP1をインストールしている場合,ステップインできませんので注意してください。

なお,EULAを読んだのですが,修正して使う事が許されているかどうかはわかりませんでした。
最終的には契約の問題になるので,修正しての利用に関しては自己の責任において,EULA違反にならないと確信できた場合にのみ行ってください。
    • good
    • 0
この回答へのお礼

>元々,TextFieldParserは簡易データベースとしての読み込みを想定しているのだと思います。
>そのため,空行自体はレコードとして意味をなさず,読み飛ばしているのだと思います。

いや、空(レコード)行は読み飛ばしてもまだ許せるのですが、生きてる行の中の一項目の中身ですから、簡易データベースとしての読み込みを想定しているとしても、完全アウトです。
マルチライン項目ですから、長文の説明や備考欄などが考えられます。
日本文は行間も読みますから、勝手に消すのはダメでしょう。


それはさておき、
懇切丁寧にお答え頂き、有難うございます。
どうするかは、EULA違反とか微妙な問題が絡んできそうですので、
ゆっくりと、見て、考えて、十分に参考にさせて頂きたいと思います。

お礼日時:2009/07/07 00:34

空行を読み飛ばすのは仕様です。



MSDN: TextFieldParser.ReadFields メソッド (Microsoft.VisualBasic.FileIO)
http://msdn.microsoft.com/ja-jp/library/microsof …

実装コードを見てみましたが,
Microsoft.VisualBasic.FileIO.TextFieldParser.IgnoreLine
メソッドが,文字列のTrim結果が空の場合にTrueを返すようになっており,
手を加える余地はないようです。
    • good
    • 0
この回答へのお礼

有難うございます。
難易度が少しでも高いと、解答はほぼ付かないですが、具体的で的確な解答頂き、感謝と同時に幸運を感じております。

余計な事をオプションではなく、強制的にやってしまうのは作った人が意地悪なのか、まともな物を作って提供するとサードパーティから物言いが付くとか、単にセンスが無いだけなのか、どちらにしても残念な事です。

手を加える余地はないですか、、、
代替的な方法何かありませんか?

あと、実装コードは簡単にみる事ができますか?
Trim結果が空の場合に行を省く部分だけ取り除いた物を別の名前で自作するとか簡単にできるでしょうか?

よろしくお願いします。

お礼日時:2009/07/05 11:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!