日記帳...か?を継承し、より柔軟でパワフルなBlogに変身しました。RSSに対応しています。リンク・コメント・トラックバックは自由にしていただいてほぼ問題ありません。RSS購読方法、僕のリンク・コメント・トラックバックについての考えを読むことをおすすめします。間違いに恐れながらCSVを解釈するTextFieldParserがバグったので、CSV解析部を自作することに...すごい長い行の端が欠けるという意味不明なことが起きたので...なんというか間抜けな話だが、CSVの仕様をよく勉強してきたので負ける気がしない。非常にベタな書き方ですが、まぁ性能はかなりいいですね。どんな具合かというとこんな感じ。data.ToArray();}静的メソッドですね。csvParserクラスを作るかと思ったが、これで十分扱いやすいので静的メソッド。大きさのわからない配列はSystem.Collections.Generic.Listクラスを使うのが便利ですね。これで要素を集めて、最後にToArrayメソッドを発動させればいいと。System.StringBuilderクラスはこれのchar版だと思ってくれればいい。いや、正しくはないけど。実はstringクラスはインスタンスで作成されてから実体が変化することはないと。str+="a";str+=b.ToString();str+=c;これはどういう動作かというと、"a"をまず作成する、そしてstrと足し算する。その結果は新しく作られた実体に入る。元のstrの実体は捨てられます。そんなことを3回も繰り返すとえらいことです。その解決のためにStringBuilderクラスがあるんです。インスタンスを作って、Appendメソッド、AppendLineメソッドでどんどん投げ入れて行きます。文字列を投げ入れていくのだから、stringの足し算とは違い実体が何度も捨てられたりはしません。最後にToStringメソッドでstringに変換して代入。これが賢いやり方です。作成時に長さがわからなくてもいい、内容を変更できる文字列のクラスだと思えばOKです。非常に気持ち悪いインデントですが、まぁ省スペースのためです。この処理は正しいCSVファイルしか処理できません。正しくないファイルなんかあっても困るけどね。"が発見されたら、まずqqbeginをtrueにする。qqbeginがtrueのうちはカンマやCR(\r)やLF(\n)であってもfieldにAppendする。qqbeginがtrueのときに"が発見されたらqqendをtrueにする。この次に"が発見されたらqqendをfalseに戻し"をAppendする。qqbeginがtrueでもqqendがtrueのときはqqbeginがfalseのときと同様に,やLFのときそれなりの処置をする。カンマがやってきたらフィールド終わりです。fieldをstringにして、recordにAddする。fieldの長さを0に、すなわち空にする。LFがやってきたら、recordをstring[]にして、dataにAddする。recordを空にする。CRはLFの前にあるだろうということで無視。CR+LFでもLFだけでもOKです。こんな風にフィールドの中身を読んでるときはfieldに集めて、読み終わったら集めたのをrecordに持って行って、レコードの最後に来たら、fieldが集められたrecordをdataに持って行くと。そんな感じになっています。Perlで正規表現でやってたのもこれと似た方法ですけどね。最後の処理ですが、最終行が空行ならばレコードは増やさないけど、それ以外はきちんと処理するということです。最終行がaだけあれば、カンマもLFも来ないとaがfieldの中に残ったままになるから、レコードに追加する。最終行がa,となっていたら、カンマの次は何もないけど、これは長さ0のフィールドがあると解釈できる。最後のLFでfield、recordが空にされてから追加されていない、これは最終行は空行であるということ。こんなときはその最終行はただの空行だからdataに追加しない。いう処理もできています。FrameworkはCSV解釈機能を持たないのだろうか。いう疑問を持つ人は多いようです。Microsoft.VisualBasic.FileIO.TextFieldParserクラスがあるけど、まぁいちいちめんどくさい。いうか、長い行の解釈に失敗してるし。これはかなりまずいと思う。いうものの自作というのは、あんまり好ましいことではないですから、できるならばライブラリを使った方がいい。すれば自作するしかない。今回のcsvParserメソッドは正しいCSVは正しく解釈できるけど、間違ったCSVはインチキな解釈をする、というのがあります。それでいいとも思うのだけどね。何が正しくないのかといわれるとそれはなかなか難しいですからね。このメソッドは十分実用的であるということにしておきましょうか。アーカイブを参照してください。Lab(07/03)バスの経路を切ったり貼ったり周旋屋のをとっつぁんの気ままな日記。Bad↓(07/23)安いのがウリの茨城空港つくば日記(03/07)プロフィールHidemaro(4304)検索キーワードこの検索は2008年5月18日以前の記事は検索できません。アーカイブを参照してください。コピーライトなどこのページではBlognPlusを使用しています有用なスクリプトの提供ありがとうございます。0.377183秒)。