2

[CRLF] が 2 つの ["] (引用符) の間に配置されている場合にのみ、一部の [CRLF] を [スペース] に置き換える必要がある 600 レコードを含む CSV ファイルがあります。2 番目の ["]が検出された場合、行の残りをスキップして、テキストの次の行に移動する必要があります。

私は本当に出発点を持っていません。誰かが提案を思いつくことを願っています。

例:

John und Carol,,Smith,,,J.S.,,,,,,,,,,,,,+11 22 333 4444,,,,,"streetx 21[CRLF]
New York City[CRLF]
USA",streetx 21,,,,New York City,,,USA,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Normal,,My Contacts,[CRLF]

この場合、最初の ["] の後の 2 つの [CRLF] をスペース [ ] に置き換える必要があります。2 番目の ["] に遭遇すると、行末をスキップして次の行に進みます。

次に、次の行で、最初の ["] が検出された後、2 番目の ["] が検出されるまですべての [CRLF] を置き換えます。[CRLF] の数はさまざまです。CSV ファイルでは、2 つの引用符 ["] の前 (23) と後 (65) のカンマ [,] の量は一定です。

したがって、コンマカウンターを使用できるかもしれません。知らない。

フィードバックありがとうございます。

4

3 に答える 3

6

これは、1 つの正規表現のみを使用して機能します (Notepad++ でテスト済み)。

Find whatフィールドに次の正規表現を入力します。

((?:^|\r\n)[^"]*+"[^\r\n"]*+)\r\n([^"]*+")

Replace withフィールドに次の文字列を入力します。

$1 $2

Wrap aroundチェック ボックス (およびRegular expressionラジオ ボタン) が選択されていることを確認します。

必要なReplace All回数だけ実行します (「0 個のオカレンスが置換されました」ダイアログがポップアップするまで)。

説明:

(
  (?:^|\r\n)     Begin at start of file or before the CRLF before the start of a record
  [^"]*+         Consume all chars up to the opening "
  "              Consume the opening "
  [^\r\n"]*+     Consume all chars up to either the first CRLF or the closing "
)                Save as capturing group 1 (= everything in record before the target CRLF)
\r\n             Consume the target CRLF without capturing it
(
  [^"]*+         Consume all chars up to the closing "
  "              Consume the closing "
)                Save as capturing group 2 (= the rest of the string after the target CRLF)

注: *+ は所有量指定子です。それらを適切に使用して、実行を高速化します。

アップデート:

この正規表現のより一般的なバージョンは、任意の改行シーケンス ( \r\n\rまたは\n) で機能します。

((?:^|[\r\n]+)[^"]*+"[^\r\n"]*+)[\r\n]+([^"]*+")

于 2013-01-24T06:27:13.277 に答える
1

この場合、ソース データは連絡先の GMail のエクスポート機能によって生成されます。以下に概説する変更 (RegEx なし) の後、結果を使用して連絡先データベースを整理し、GMail または MS Outlook に再インポートできます。はい、@alan と @robinCTS の肩の上に立っています。あなたがた両方に感謝します。

5 つのステップでの手順:

Notepad++ を使用 / 検索置換 / 拡張検索モード / ラップアラウンド = オン

-1- すべての [CRLF] を一意のセット文字または文字列に置き換えます ([ ~~] を使用しました)

find: \r\n and replace with:~~ ファイルの内容は 1 行のみになりました。

-2- ここで、ヘッダー行を分離する必要があります。この場合、最初のレコードが 88 番目の直前に始まる場所に移動します。カンマ (87 番目のカンマ [,] の後の単語を含む) を入力し、リターン キーを押して手動で [CRLF] を入力します。現在、ヘッダーとレコードの 2 行があります。

-3- すべての [ ] を検索し、[ ,~~] に置き換え,\r\nます。結果は 1 行に 1 レコードです。

-4- 残りの [~~] find: を削除し、 [ ] スペース~~ に置き換えます。ファイルから不要な [CRLF] が取り除かれました。

-5- ファイルを保存して、意図したとおりに使用してください。

于 2013-01-25T00:35:32.087 に答える
0

おそらく3つのステップでそれを行います(CSVに88個のフィールドがあると仮定します。これは、前に23個のコンマがあり、毎秒後に65個あると言ったからです"

ステップ 1 : すべての CR/LF を、ファイルのどこにもない文字に置き換えます。~

検索:\r\n置換:~

ステップ 2 :必要な CSV の改行を再挿入するには、~88 番目の「カンマ グループ」(または CSV の多くのフィールド) の後にすべてを置き換えます。\r\n

検索:((?:[^,]*?,){88})~置換:$1\r\n

ステップ 3 : 残りのすべて~をスペースに置き換えます

検索~ 置換:<space>

于 2013-01-24T05:13:48.943 に答える