4

次のような別の DB からの CSV ダンプがあります (ID、名前、メモ):

1001,John Smith,15 Main Street
1002,Jane Smith,"2010 Rockliffe Dr.
Pleasantville, IL
USA"
1003,Bill Karr,2820 West Ave.

最後のフィールドには改行とコンマを含めることができ、その場合は二重引用符で囲みます。そして、これらのリターンとカンマを保持する必要があります。

このコードを使用して、CSV をテーブルにインポートします。

BULK INSERT CSVTest
FROM 'c:\csvfile.csv'
WITH
(
  FIELDTERMINATOR = ',',
  ROWTERMINATOR = '\n'
)

SQL Server 2005の一括挿入では、引用符内のキャリッジ リターンが行終端記号ではないことを認識できません
克服する方法は?


UPDATE :
フィールド内に改行を保持する唯一の方法は、別の行セパレーターを使用することです。そのため、改行の前にパイプを配置して、すべての行区切りの改行をマークしたいと思います。CSV を次のように変更するにはどうすればよいですか?

1001、ジョン スミス、15 メイン ストリート|
1002、ジェーン・スミス、「2010 Rockliffe Dr.
Pleasantville、IL
USA」|
1003,Bill Karr,2820 West Ave.|

4

6 に答える 6

1

これらの改行をスクリプトで1行にまとめることができます。たとえば、GNUsedを使用して改行を削除できます。例えば

$ more file
1001,John Smith,15 Main Street
1002,Jane Smith,"2010 Rockliffe Dr.
Pleasantville, IL
USA"
1003,Bill Karr,"2820
West Ave"

$ sed '/"/!s/$/|/;/.*\".*[^"]$/{ :a;N };/"$/ { s/$/|/ }' file
1001,John Smith,15 Main Street|
1002,Jane Smith,"2010 Rockliffe Dr.
Pleasantville, IL
USA"|
1003,Bill Karr,"2820
West Ave"|

その後、一括挿入できます。

編集:

/"/!s/$/|/;/.*\".*[^"]$/{ :a;N };/"$/ { s/$/|/ }これをファイルに保存します。たとえば、 myformat.sed。次に、コマンドラインでこれを行います

c:\test> sed.exe -f myformat.sed myfile

于 2010-03-25T09:06:35.233 に答える
1

SQL Server での一括操作は、ファイルが慎重にフォーマットされていればインポートできますが、特に CSV をサポートしていません。私の提案は、すべてのフィールド値を引用符で囲むことです。BULK INSERT では、フィールド値内でキャリッジ リターンを使用できる場合があります。そうでない場合、次のソリューションは Integration Services パッケージになる可能性があります。

詳細については、一括エクスポートまたは一括インポート用のデータの準備を参照してください。

于 2010-03-25T04:08:25.733 に答える
0

すべての知識のソース(ウィキペディア)によると、csvはレコードを区切るために新しい行を使用します。したがって、あなたが持っているものは有効なcsvではありません。

私の提案は、ファイルを処理して各レコードをデータベースに追加するためのperlプログラムを作成することです。

あなたがPerlの人でないなら、あなたはプログラミングサイトを使うか、ある種のSOの人があなたのためにプログラムの構文解析セクションを書くかどうか見ることができます。

追加した:

考えられる解決策

OPは入力ファイルを変更できると述べているので、「」に続かないすべての新しい行を予約済みの文字シーケンスに変更します(例:XXX)。

これは、多くのエディターで自動置換される可能性があります。Windowsでは、UltraEditには正規表現の検索/置換機能が含まれています

次に、新しい行が埋め込まれなくなるため、dbmsにインポートします。

次に、SQL置換を使用して、XXXオカレンスを新しい行に戻します。

于 2010-03-25T03:42:01.860 に答える
0

CSV ファイルの内容を制御できる場合は、フィールド内の改行 ( CRLF) を改行以外の文字 (おそらくCRまたはのみLF) に置き換え、インポート後にスクリプトを実行してそれらをCRLF再び置き換えることができます。

これは、MS Office 製品 (Excel、Access) がこの問題に対処する方法です。

于 2010-03-25T08:06:08.470 に答える
0

OK、これは私が問題を解決するために書いた小さな Java プログラムです。
コメント、修正、最適化は大歓迎です。

import java.io.*;

public class PreBulkInsert
{
    public static void main(String[] args)
    {
        if (args.length < 3)
        {
            System.out.println ("Usage:");
            System.out.println ("  java PreBulkInsert input_file output_file separator_character");
            System.exit(0);
        }

        try
        {
            boolean firstQuoteFound = false;
            int fromIndex;
            int lineCounter = 0;
            String str;

            BufferedReader in = new BufferedReader(new FileReader(args[0]));
            BufferedWriter out = new BufferedWriter(new FileWriter(args[1])); 
            String newRowSeparator = args[2];

            while ((str = in.readLine()) != null)
            {
                fromIndex = -1;
                do
                {
                    fromIndex = str.indexOf('"', fromIndex + 1);
                    if (fromIndex > -1)
                        firstQuoteFound = !firstQuoteFound;
                } while (fromIndex > -1);

                if (!firstQuoteFound)
                    out.write(str + newRowSeparator + "\r\n");
                else
                    out.write(str + "\r\n");
                lineCounter++;
            }
            out.close();
            in.close();
            System.out.println("Done! Total of " + lineCounter + " lines were processed.");
        }
        catch (IOException e)
        {
            System.out.println(e.getMessage());
            System.exit(1);
        }       
    }
}
于 2010-03-26T04:05:19.857 に答える
-1

CSV が有効な形式でない限り、これをインポートすることはできません。そのため、ダンプを修正するか、検索と置換を使用して手動で不要な改行文字を修正する必要があります。

于 2010-03-25T04:16:22.547 に答える