DataGridViewに5万行を表示し、選択可能最大行数(5万行)を、現実的な処理時間で、CSVファイルとして保存するコードが出来た!
1.最初はStreamWriterクラスを用いたが、.Net framework のバグで、メモリを限界まで使用する現象が発生し、アプリケーションが必ずハングする。試行錯誤したが、StreamWriterクラスでは無理だった。
2.FileクラスのAppendAllTextを用いる事で、安定的にファイル書き込み処理が実行されるようになったが、書き込みが終わるまで数時間かかってしまう。
3.FileクラスのAppendAllTextを、1行単位に実行するのではなく、1000行単位に実行するようにしたら、2分程度で5万行のファイル書き込みが完了するようになった。
最終的に出来上がったソースはこちら。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
using System.IO; private static void Writeグリッド明細_Selected(string str保存先ファイルパス, DataGridView grid, int i開始列) { int iRowCnt = 0; string strRowData = ""; foreach (DataGridViewRow row in grid.SelectedRows) { for (int iCol = i開始列; iCol < row.Cells.Count; iCol++) { strRowData += "\"" + row.Cells[iCol].FormattedValue.ToString() + "\""; if ((grid.Columns.Count - 1) > iCol) strRowData += ","; } string strTmp = strRowData.Replace(",", "").Replace("\"", ""); if (strTmp.Length == 0) continue; if (iRowCnt < 1000) { strRowData += "\r\n"; iRowCnt++; } else { File.AppendAllText(str保存先ファイルパス, strRowData + "\r\n", Encoding.GetEncoding("Shift_JIS")); iRowCnt = 0; strRowData = ""; } } if (strRowData != "") File.AppendAllText(str保存先ファイルパス, strRowData + "\r\n", Encoding.GetEncoding("Shift_JIS")); } |
コメント