8

データベースに 1 GB 程度の巨大な .csv ファイルをインポートしたい。

私のアプリケーションは、Visual Studio 2010 で c# でコーディングされています。ローカルで実行されており、ネットワーク上で使用する必要はありません。

SQL コンパクト ツールボックス スクリプトを使用して 25 MB のみをインポートしようとすると、Visual Studio でクラッシュが発生します。

使用しようとするstringbuilderと、メモリ不足の例外が発生し (約 4 ギガのメモリが使用されます!)、失敗します。

これらのファイルを Excel または Access にインポートしてデータベースに変換しようとしても失敗します。

私の問題を解決するために、これらのデータベースのどれがより適切に処理できますか?

  • SQL エクスプレス
  • SQLコンパクト
  • ローカル SQL Server データベース

また、できるだけ早くインポートし、データグリッドビューにすばやくロードするには、どの方法を使用すればよいですか?

助けてくれてありがとう。

4

4 に答える 4

7

CSV ファイルにコンマを含む文字列が含まれていない場合は、SQL から直接BULK INSERTを実行できます (そうである場合は、最初に区切り文字をバー ( |) 文字などに変更する必要があります。これが最も直接的な方法です)。フラット ファイルからデータベースにデータを取得し、SSIS や Excel などの中間プログラムを必要としません。

私は頻繁に使用していますが、外部から SQL にデータを取り込む最も高速で効率的な方法です。コマンドは次のようになります

BULK INSERT MyDatabase.dbo.MyTable 
      FROM MyFileName
           DATAFILETYPE='char',  
           FIELDTERMINATOR=',',
           BATCHSIZE=10000

最も一般的な戦略は、データを作業テーブルにロードし、必要なクリーンアップ/変換を行ってから、実際のターゲット テーブルに挿入することです。

于 2013-08-19T13:54:26.903 に答える
5

本当に C# を使用してこれを実現したい場合は、CSV を 1 行ずつ読み取り、次の CSV に移動する前に挿入する必要があります。

2GBの「CSV」(タブ区切り)を読み取ってMSSQLにロードする必要がある同様の状況があります。これが私がセットアップした方法です。

using (FileStream fs = new FileStream(@"C:\file.csv", FileMode.Open, FileAccess.Read, FileShare.None))
using (StreamReader sr = new StreamReader(fs, Encoding.GetEncoding(1252)))
{
    if (sr.ReadLine() == null) //Take this out if you don't have a header
    {
        throw new Exception("Empty file?!");
    }

    while (sr.Peek() >= 0)
    {
          String s = sr.ReadLine();

          //SPLIT

          //INSERT SQL
    }
}
于 2013-08-19T19:32:23.280 に答える
1

SQL Express と標準の SQL Server はどちらも、ストレージの候補として適しています。また、データのインポートに使用するものに関しては、SSIS を使用してください。SQL Express または標準 SQL Server インスタンスでデータベースを作成したら、そのデータベースを右クリックすると、Tasksメニュー項目の下に のオプションが表示されますImport Data。ここでは、Excel の場合はデータ ソースを選択し、それをデータベースにインポートする方法について説明します。

このスクリプトは、プロセスの最後に保存できます。

于 2013-08-19T12:59:18.777 に答える
1

C# で SQLBulkImporter オブジェクトを使用できます。魅力のように機能します。

于 2013-08-19T15:23:10.450 に答える