0

SQL Server Management Studio を使用して MS SQL データベースでクエリを実行したところ、一部のフィールドに改行が含まれていました。結果を csv として保存することを選択しましたが、どうやら MS SQL は正しくフォーマットされた CSV ファイルを提供するほど賢くありません。

改行を含むこれらのフィールドの一部は引用符で囲まれていますが、そうでないものもあります。理由はわかりません (複数の改行が含まれている場合はフィールドを引用しているようですが、改行が1つしか含まれていない場合はそうではありません、ありがとうMicrosoft、それは便利です)。

この CSV を Excel で開こうとすると、改行のために一部の行が間違っており、1 行が 2 行であると認識されます。

どうすればこれを修正できますか?

正規表現を使用できると考えていました。たぶん次のようなもの:

/,[^,]*\n[^,]*,/

これの問題は、ある行の最後の要素と次の行の最初の要素に一致することです。

問題を示す csv の例を次に示します。

field a,field b,field c,field d,field e
1,2,3,4,5
test,computer,I like
pie,4,8
123,456,"7

8

9",10,11
a,b,c,d,e
4

2 に答える 2

2

単純な正規表現の置き換えは機能しませんが、以下に基づいた解決策がありますpreg_replace_callback:

function add_quotes($matches) {
    return preg_replace('~(?<=^|,)(?>[^,"\r\n]+\r?\n[^,]*)(?=,|$)~',
                        '"$0"',
                        $matches[0]);
}

$row_regex = '~^(?:(?:(?:"[^"*]")+|[^,]*)(?:,|$)){5}$~m';

$result=preg_replace_callback($row_regex, 'add_quotes', $source);

の秘訣$row_regexは、事前に列がいくつあるかを知ることです。行の先頭から (複数行モードで) 開始し、^フィールドのように見える次の 5 つを消費します。最後の列で常にオーバーシュートし、「実際の」行区切りと次の行の最初のフィールドを消費してから、行の終わりに戻るため、私が望むほど効率的ではありません。ドキュメントが非常に大きい場合は、問題になる可能性があります。

列の数が事前にわからない場合は、最初の行だけを一致させ、一致を数えることで確認できます。もちろん、これは、問題の原因となった奇妙なフィールドが行に含まれていないことを前提としています。最初の行に列ヘッダーが含まれている場合、それについて心配する必要はありません。また、正当な引用フィールドについても心配する必要はありません。これが私がそれをした方法です:

preg_match_all('~\G,?[^,\r\n]++~', $source, $cols);

$row_regex = '~^(?:(?:(?:"[^"*]")+|[^,]*)(?:,|$)){' . count($cols[0]) . '}$~m';

サンプル データには改行 ( \n) しか含まれていませんが、DOS スタイル\r\nも許可しています。(ファイルは Microsoft 製品によって生成されるため、古い Mac スタイルの CR のみのセパレーターについては心配しません。)

オンラインデモを見る

于 2012-06-08T17:39:52.763 に答える
0

Javaプログラムによるソリューションが必要な場合は、OpenCSVライブラリを使用してファイルを開きます。手動操作の場合は、Vimなどのテキストエディタでファイルを開き、replaceコマンドを実行します。バッチ操作の場合は、perlコマンドを使用してCRLFをクリーンアップできます。

于 2012-06-08T14:25:10.423 に答える