3

2.5 GBを超える非常に大きな CSV ファイルがあり、SQL Server 2005 にインポートするColumn delimiter not foundと、特定の行 (82,449) にエラー メッセージ " " が表示されます。

問題は、その列のテキスト内の二重引用符にあります。この例では、誰かが " Transferred money to ""MIKE"", Thnks" と書いたメモ フィールドです。

ファイルが非常に大きいため、Notepad++ で開いて変更を加えることができず、VIM を見つけました。

私は VIM に非常に慣れていないので、チュートリアル ドキュメントを確認しました。このドキュメントでは、ファイルを変更する方法を教えてくれました。82,449 Gその行を見つけてl、その場所にx、二重引用符を付けます。

を使用してファイルを保存すると、ファイル:saveas c:\Test VIM\Test.csvの一部のようです。元のファイルは 2.6GB で、新しく保存されたファイルは 1.1GB です。元のファイルには 9,389,222 行あり、新しく保存されたファイルには 3,751,878 行あります。保存する前にコマンドを使用しGてファイルの最後に到達しようとしましたが、サイズがかなり大きくなりましたが、それでもファイル全体は保存されませんでした。を使用する前Gは、ファイルはわずか 230 MB でした。

ファイル全体を保存しない理由について何か考えはありますか?

4

3 に答える 3

4

sedファイル全体をメモリに保持しようとせずに、テキストをパイプすることができる、Linux に似た「ストリーム エディタ」を使用する必要があります。sed では、次のようにします。

sed 's/""MIKE""/"MIKE"/' < source_file_to_read > cleaned_file_to_write

Windows 用の sedがあります。

2 番目の選択肢として、Perl、Python、Ruby などのプログラミング言語を使用して、ファイルからテキストを 1 行ずつ処理し、二重引用符を検索しながら書き込み、次に問題の行を変更し、書き込みを続けることができます。ファイルが完全に処理されるまで。

マシンに十分な空き RAM がある場合、VIM はファイルをロードできる可能性がありますが、処理は遅くなります。存在する場合は、次を使用して直接モードから検索できます。

:/""MIKE""/

二重引用符を手動で削除するか、次を使用して VIM に自動的に変更を行わせます。

:%s/""MIKE""/"MIKE"/g

どちらの場合も、次を使用してファイルを書き込んでから閉じます。

:wq

VIM では、ダイレクト モードはエディターの通常の状態であり、キーを使用してアクセスできますESC

于 2012-10-16T16:27:04.347 に答える
0

また、ファイルをより小さく管理しやすいチャンクに分割してから、結合して戻すこともできます。ファイルを均等に分割できるbashのスクリプトは次のとおりです。

#!/bin/bash

fspec=the_big_file.csv
num_files=10 # how many mini-files you want

total_lines=$(cat ${fspec} | wc -l)
((lines_per_file = (total_lines+num_files-1) / num_files))
split --lines=${lines_per_file} ${fspec} part.
echo "Total Lines = ${total_lines}"
echo "Lines per file = ${lines_per_file}"
wc -l part.*

61151570行の1GBファイルでテストしたところ、結果の各ファイルはほぼ100MBでした。

編集:

あなたがWindowsを使用していることに気付いたので、上記は当てはまらない可能性があります。単純なテキストスプリッターのようなユーティリティを使用して、同じことを行うWindowsプログラムを使用できます。

于 2012-10-16T16:38:04.987 に答える