お世話になっております。
現在、ハンディターミナルの開発を行っていて、CSVファイルのデータをListに登録したいと考えています。
Listへの登録はできているのですが、時間がかかってしまっているのをどうにかして早くすることは
できないでしょうか?
CSVファイルは、ヘッダー:有、括り:有(")、区切り文字:, 、文字コード:SJIS です。
2つのファイルを連続して読込み、それぞれ別のListに登録しています。
1つ目のファイルは14項目、2つ目のファイルは18項目あり、共に1万5千件のデータ量です。
1つ目のファイルに11秒ほど、2つ目のファイルに35秒ほどかかってしまっています。
これを数秒まで縮めることは可能でしょうか?
宜しくお願いします。
以下現状のコード(1ファイル目)です。2ファイル目も同様の処理です。
行データを配列に変換している部分のソースは、サイトからのコピペを使用してます。
(ArrayListの部分をList(Of string)に変更していますが)
CsvToListの部分の元ソース
環境:Visual Studio 2008 (vb.net)
Public M_MODEL As New List(Of model) Public Structure model Dim item_id As String Dim bumon_cd As String Dim mgt_num As String Dim model_cd As String Dim pert_cd As String Dim type_cd As String Dim gds_cmpt_cd As String Dim model_nm As String Dim pert_nm As String Dim type_nm As String Dim gds_cmpt_nm As String Dim gds_kbn As Integer Dim JAN As String Dim criterion As Integer End Structure Public Function Import_M_MODEL() As Boolean Dim ret As Boolean = True Dim row As model Dim Reader As IO.StreamReader = Nothing Dim line As String Dim strTemp As String() Dim header As Integer = 0 Try Reader = New IO.StreamReader('ファイルパス', SJIS) Do Until Reader.EndOfStream 'ヘッダーは読まない If header = 0 Then line = Reader.ReadLine header = 1 End If line = Reader.ReadLine '行単位データを,で分割し、配列へ格納 strTemp = CsvToList(line)(0) row = New model '各列に値をセット row.item_id = strTemp(0) row.bumon_cd = strTemp(1) row.mgt_num = strTemp(2) row.model_cd = strTemp(3) row.pert_cd = strTemp(4) row.type_cd = strTemp(5) row.gds_cmpt_cd = strTemp(6) row.model_nm = strTemp(7) row.pert_nm = strTemp(8) row.type_nm = strTemp(9) row.gds_cmpt_nm = strTemp(10) If strTemp(11).Length = 0 Then row.gds_kbn = Nothing Else row.gds_kbn = CInt(strTemp(11)) End If row.JAN = strTemp(12) If strTemp(13).Length = 0 Then row.criterion = Nothing Else row.criterion = CInt(strTemp(13)) End If 'Listに行を追加 M_MODEL.Add(row) Loop Catch ex As Exception ret = False Finally Reader.Close() End Try Return ret End Function
以下はCsvToListのソースです。
''' <summary> ''' CSVをListに変換 ''' </summary> ''' <param name="csvText">CSVの内容が入ったString</param> ''' <returns>変換結果のList</returns> Public Function CsvToList(ByVal csvText As String) As List(Of String()) '前後の改行を削除しておく csvText = csvText.Trim(New Char() {ControlChars.Cr, ControlChars.Lf}) Dim csvRecords As New List(Of String()) Dim csvFields As New List(Of String) Dim csvTextLength As Integer = csvText.Length Dim startPos As Integer = 0 Dim endPos As Integer = 0 Dim field As String = "" While True '空白を飛ばす While startPos < csvTextLength _ AndAlso (csvText.Chars(startPos) = " "c _ OrElse csvText.Chars(startPos) = ControlChars.Tab) startPos += 1 End While 'データの最後の位置を取得 If startPos < csvTextLength AndAlso csvText.Chars(startPos) = ControlChars.Quote Then '"で囲まれているとき '最後の"を探す endPos = startPos While True endPos = csvText.IndexOf(ControlChars.Quote, endPos + 1) If endPos < 0 Then Throw New ApplicationException("""が不正") End If '"が2つ続かない時は終了 If endPos + 1 = csvTextLength OrElse _ csvText.Chars((endPos + 1)) <> ControlChars.Quote Then Exit While End If '"が2つ続く endPos += 1 End While '一つのフィールドを取り出す field = csvText.Substring(startPos, endPos - startPos + 1) '""を"にする field = field.Substring(1, field.Length - 2). _ Replace("""""", """") endPos += 1 '空白を飛ばす While endPos < csvTextLength AndAlso _ csvText.Chars(endPos) <> ","c AndAlso _ csvText.Chars(endPos) <> ControlChars.Lf endPos += 1 End While Else '"で囲まれていない 'カンマか改行の位置 endPos = startPos While endPos < csvTextLength AndAlso _ csvText.Chars(endPos) <> ","c AndAlso _ csvText.Chars(endPos) <> ControlChars.Lf endPos += 1 End While '一つのフィールドを取り出す field = csvText.Substring(startPos, endPos - startPos) '後の空白を削除 field = field.TrimEnd() End If 'フィールドの追加 csvFields.Add(field) '行の終了か調べる If endPos >= csvTextLength OrElse csvText.Chars(endPos) = ControlChars.Lf Then '行の終了 'レコードの追加 'csvFields.TrimExcess() csvRecords.Add(csvFields.ToArray) csvFields.Clear() If endPos >= csvTextLength Then '終了 Exit While End If End If '次のデータの開始位置 startPos = endPos + 1 End While 'csvRecords.TrimExcess() Return csvRecords End Function
回答6件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。