私が書いた古いウェブアプリを見ていて、DataTable
から4500レコードを読み込むのに約1時間かかるので、CSVファイルに書き込むことができます。私はこれを改善するための何らかの方法が必要だと感じています。注意すべきこのDataTableをより効率的に読んでCSVファイルに書き込むことはできますか?
いくつかのこと:
のDataTableが... 376個の列は、少なくとも
が含まれている、私はExcelの
NL
列がに変換するものだと思います。私はちょうど列の数を今見上げて、そんなにたくさんあるということを知らなかった。当社のソフトウェアベンダーは、このプロセスの動的SQL文の価値を認識していないため、ソフトウェアのアップグレードによって、必要なものだけを選択するのではなく、列を追加し続けるだけです。私はデータの種類に応じてデータを生成し、SQLステートメントを変更することはできません
、データが特定の形式でフォーマットする必要が
データはありませんコンマなどの特殊文字が含まれてい
遅い部分がデータを読み取っています。 SQLサーバーからデータを取得し、それをCSVに書き込むのは高速です。
ここにコードがあります。私は私がやっていたかわからなかったときにそれを背中に書いた、混乱を許し、私はまだVBで働いていたとき
Function ReadDataTableForCSV(dt as DataTable)
Dim sb = New StringBuilder()
Dim dataTypes As New Dictionary(Of String, Integer)
' Header Row
For i as Integer = 0 to dt.Columns.Count - 1
Dim col as DataColumn = dt.Columns(i)
Dim t = col.DataType
If t is GetType(Boolean) Then
dataTypes.Add(i, 1)
Else If t is GetType(Decimal) Then
dataTypes.Add(i, 2)
Else
dataTypes.Add(i, 3)
End If
sb.Append(String.Format("""{0}""", col.ColumnName))
sb.Append(Iif(i = dt.Columns.Count - 1, vbLf, ","))
Next
' Items
For Each row as DataRow in dt.Rows
For i As Integer = 0 To dt.Columns.Count - 1
Select dataTypes(i)
Case 1
sb.Append(String.Format("""{0}""", CInt(row(i))))
Case 2
sb.Append(String.Format("""{0}""", FormatNumber(row(i), 2, , , 0)))
Case 3
sb.Append(String.Format("""{0}""", row(i)))
End Select
sb.Append(Iif(i = dt.Columns.Count - 1, vbLf, ","))
Next
Next
End Function
編集:削除コード問題
最初にまず最初に2つのコードセクションがあります。データテーブルからの読み取り、およびディスクへの書き込みを行います。どちらが遅いですか? (私は間違いなく*ファイルを書いているファイルを整理しています。心配します。単純に 'File.WriteAllText'は1回の呼び出しでそれを行います) –
@JonSkeet申し訳ありません。 DataTableから読み取る部分は遅い部分です。 – Rachel
実際、私は前に誤解されていました。明らかに* DataTable(GetMyDataTableへの呼び出し)を取得し、そこから読み取り、次に書き込みを行う*コードが3つずつ分かれています。間違いなく、それを作成するよりもむしろ遅いデータテーブルからの読み込みですか? –