Mr.Tの場所

特攻野郎Aチームじゃないよー

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  253  : 記事  0  : コメント  3733  : トラックバック  52

ニュース

  • 性別:男
  • 猫1:まる
  • 猫2:もろ
  • 猫3:にゃん左部郎
  • タバコ:男は黙ってJPS
[わんくま同盟] C#, VB.NET 掲示板

書庫

日記カテゴリ

Mr.Tです、こんにちは。

CSVファイルでは、どのフィールドが、どういう属性を持ったもなのか(文字なのか、数値なのか、Boolなのか)

という構造はわからない。

そのためプログラム上で、判断する必要が出てくるわけだが、その際のことをまとめてみた。

CSVファイルではなく、CSVとしてのデータをすでにもらっている場合でのMemoです。

#VB.NET .NETFramework2.0での話

 

1)読み込んだファイルの内容を、改行で区切る

 Splitが有効ではあるが、これを使うと配列になってしまう。
 その先、更にカンマやタブなどで分解するときにSplitが必要になるため、配列でのループが2重で発生する。
 そのため文字列の切り出しで行ってもいいだろう。

 改行については、改行文字に注意。CrLfだったり、Crだったり、Lfだったりする可能性があるが、相手がなんなのか
 わからん場合は、明示的に、

 Allrecords = Allrecords.Replace(ControlChars.CrLf, ControlChars.Lf)
 Allrecords = Allrecords.Replace(ControlChars.Cr, ControlChars.Lf)

 とでもしておくと、迷わずに済む。

#このコストはあんまり気にしてない
#置換の順番には、注意。Crを先に置換すると、CrlfがLfLfになっちまう

 

2)レコードをいれておくなら、Classでもつくっとけ。

 単純にPrivateなClassをつくってもそれまでなような気がする。(DataTableとかでもいいんだろうけど)

 で、その際には、Enumで配列データの添え字に対する定義をつくっておこう。

    Private Enum CSVField As Integer
        PlaceCode = 0
        AllocationCode
        AddressCode
        AllocationBudge
    End Enum

こうすりゃ、クラスのフィールドやプロパティにセットするときも名前が同じにしとけば間違えにくいと思う。

       Dim item as CSVitem = new CSVItem

        item.PlaceCode = targetAry(EnumBudgeCSVField.PlaceCode)
        item.AllocationCode = targetAry(EnumBudgeCSVField.AllocationCode)
        item.AddressCode = targetAry(EnumBudgeCSVField.AddressCode)

 CSVの変更があった場合やレイアウトの変更があった場合でも、修正部分は減る。

 

3)配列の上限は、Enumからとっておけばイイんじゃね?

 例えばデータチェックでは、配列の上限がいくらになるかで判定するだろう。

        If [Enum].GetValues(GetType(EnumBudgeCSVField)).GetUpperBound(0) <> targetAry.GetUpperBound(0) Then
            Me._errorMessage = "データが正しく設定されていません" & ControlChars.CrLf & _
                                    "原始データ=>:" & recordData
            Return false
        End If

 最大値つーことで、Enumの一番最後の要素で判断するのは危険。CSVに変更があったときに、忘れがちなとこだと思う。

 

4)DBに入れるときは、そのままInsertにできるような部分構文吐き出す、ToStringみたいなメソッドがあると、楽な場合もある。

 別にToStringでなくてもいいんだろうが、まあToSQLStringでもいいだろうし、GetSQLStringでもいい。

  Insert構文は、Insert into TableName(fields1,) values( **,**,'**',...)とこんな感じだから、value以下のデータが
  さっくり取り出せるなら、簡単じゃないか。

 

5)CSVデータは、List構造や、Stackとか、Queueとかつかっとけ。

 2)でつくったクラスを List (of T)とか、 Stack(of T)とか、Queue(of T)で利用すれば扱いが楽だろう。

 

6)データにカンマとかある? そんなのは、格納クラスでつくりこんでしまえ。

 データにカンマが存在する場合とか、""とかで文字列は囲ってあるとか、色々やりたいなら、やはり2)とかのクラスつくろうよ。

投稿日時 : 2007年11月22日 11:09

コメント

# re: 配列とCSVファイルの有効利用:Memo 2007/11/22 11:20 中博俊
とりあえず全体的なアプローチとして違和感を覚えます。
naka.wankuma.com/site/library/dotnet2.0/
このあたりは使えませんか?


# re: 配列とCSVファイルの有効利用:Memo 2007/11/22 12:16 Mr.T
>とりあえず全体的なアプローチとして違和感を覚えます。

実は書いた後で、ちょっと反省しました。
アンマネージリソースに対しての扱いはまったく
無視しているんですね。
というのも、Webアプリでファイルアップロード
したデータを受け取って使うことが前提だったもので、
CSVファイルというより、CSVとして扱えるデータ
をどうするか、ってことを考えたもので...

>naka.wankuma.com/site/library/dotnet2.0/
おう、こんなのあったんだ...orz
リソース部分の扱いを改造すればいけそうです、ありがとうございます。

# re: 配列とCSVデータの有効利用:Memo 2007/11/22 13:00 Mr.T
なんだか説明不足な点が多すぎかも...

元々のクラスって、
1)CSVデータが渡される
2)データを行ごとにチェックして、エラーがあればその内容を行単位で持つ
3)エラーがなくなれば、全レコードを、DBへ格納、
チェックでのエラーがあれば、表示用のエラー行データを参照してもらう。

こういう動きをするもんだったんです。
読み込めるCSVは1種類だけという指定であるため、汎用性はまったくなし。

うむむむ、タイトルと乖離してしまったエントリだぞよ。

# re: 配列とCSVデータの有効利用:Memo 2007/11/23 19:02 けろ
私も中さんと同意見で、結構違和感が....

CSVだといいのかもしれませんが、固定長レコードでも
ある程度使い回しがきくものがいいですね!
とわがままを言ってみるw

(固定長のデータをこのご時世でまだ使っているのか?という突っ込みもありますが、ホスト系のシステムがあるんで、仕方ないです)

Post Feedback

タイトル
名前
Url:
コメント