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)とかのクラスつくろうよ。