ファイルからいくつかのデータをインポートしていますが、数値が変換されるCSV
よりも大きいなどです。1000
1,100
int
これから引用符とコンマの両方を削除して、フィールドに入力できるようにするための良い方法は何ですか?
編集:
データは実際にはすでにMySQLテーブルにあるので、SQLを使用してこれを実行できる必要があります。混乱してすみません。
ここでの私の推測では、数値フィールドへのインポートが失敗した可能性があるため、データはフィールドが実際にはvarcharまたは何らかの文字フィールドであるとインポートできたためです。これは、純粋にMySQL、SQLソリューションを実行したテストケースです。
テーブルは、varcharである単一の列(アルファ)です。
mysql> desc t;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| alpha | varchar(15) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
レコードを追加する
mysql> insert into t values('"1,000,000"');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t;
+-------------+
| alpha |
+-------------+
| "1,000,000" |
+-------------+
ステートメントを更新します。
mysql> update t set alpha = replace( replace(alpha, ',', ''), '"', '' );
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from t;
+---------+
| alpha |
+---------+
| 1000000 |
+---------+
したがって、最終的に私が使用したステートメントは次のとおりです。
UPDATE table
SET field_name = replace( replace(field_name, ',', ''), '"', '' );
MySQLのドキュメントを調べましたが、正規表現の検索と置換を実行できるようには見えませんでした。Eldilaのように、検索には正規表現を使用し、次に置換には代替ソリューションを使用することもできます。
s/"(\d+),(\d+)"/$1$2/
また、数値に1つ以上のコンマが含まれている場合、たとえば「1,000,000」の場合は、グローバル置換(perlで)を実行する必要があるため、注意が必要ですs///g
。ただし、グローバル置換を使用しても、置換は最後に中断したところから開始され(perlが異なる場合を除く)、他のすべてのコンマ区切りグループを見逃します。考えられる解決策は、最初の(\ d +)をそのようs/(\d+)?,(\d+)/$1$2/g
にオプションにすることです。この場合、引用符を削除するために2番目の検索と置換が必要になります。
これは、文字列「1,000,000」だけに作用する正規表現のいくつかのルビーの例です。文字列内に二重引用符がないことに注意してください。これは、数値自体の文字列にすぎません。
>> "1,000,000".sub( /(\d+),(\d+)/, '\1\2' )
# => "1000,000"
>> "1,000,000".gsub( /(\d+),(\d+)/, '\1\2' )
# => "1000,000"
>> "1,000,000".gsub( /(\d+)?,(\d+)/, '\1\2' )
# => "1000000"
>> "1,000,000".gsub( /[,"]/, '' )
# => "1000000"
>> "1,000,000".gsub( /[^0-9]/, '' )
# => "1000000"
これは正規表現の良い例です。インポートする前(簡単)、またはSQLインポートがそれらの文字を受け入れた場合(それほど簡単ではない)に、データに対して検索と置換を実行できます。ただし、どちらの場合でも、エディター、スクリプト言語、GUIプログラムなど、検索と置換を行う方法はいくつもあります。すべての不良文字を検索して置換する必要があることを忘れないでください。
コンマと引用符を見つけるための一般的な正規表現(二重引用符のみを想定)は次のとおりです:(ブラックリスト)
/[,"]/
または、将来何かが変更される可能性がある場合、この正規表現は数値または小数点以外のものと一致します。(ホワイトリスト)
/[^0-9\.]/
上記の人々によって議論されたのは、CSVファイル内のすべてのデータを知っているわけではないということです。CSVファイルのすべての数字からカンマと引用符を削除したいようです。ただし、CSVファイルに他に何があるかわからないため、他のデータが破損しないようにする必要があります。やみくもに検索/置換を行うと、ファイルの他の部分に影響を与える可能性があります。
このperlコマンドを使用できます。
Perl -lne 's/[,|"]//; print' file.txt > newfile.txt
あなたはそれで少し遊ぶ必要があるかもしれません、しかしそれはトリックをするべきです。
私のコマンドはすべての'、'、および'"'を削除します。
刺し傷「1,000」をより厳密に変換するには、次のコマンドが必要になります。
Perl -lne 's/"(\d+),(\d+)"/$1$2/; print' file.txt > newfile.txt
変更された質問の解決策は基本的に同じです。
regexwhere句を使用してselectクエリを実行する必要があります。
のようなもの
Select *
FROM SOMETABLE
WHERE SOMEFIELD REGEXP '"(\d+),(\d+)"'
これらの行ごとに、次の正規表現置換s / "(\ d +)、(\ d +)" / $ 1 $ 2 /を実行してから、フィールドを新しい値で更新します。
ファイルやデータベースに大規模な変更を加える前に、Joseph Pecoraroに真剣に取り組み、バックアップをとってください。なぜなら、正規表現を行うときはいつでも、見逃したケースがあると、データを真剣に台無しにする可能性があるからです。
実際にはnlucaroni、あなたのケースは完全に正しくありません。あなたの例には二重引用符が含まれていないので、
id,age,name,...
1,23,phil,
私の正規表現と一致しません。「XXX、XXX」の形式が必要です。いつ正しく一致しないかの例は考えられません。
次のすべての例では、正規表現にデリミネーターが含まれていません。
"111,111",234 234,"111,111" "111,111","111,111"
反例があれば教えてください。
乾杯!
DanielとEldilaの答えには、1つの問題があります。それは、ファイル全体のすべての引用符とコンマを削除することです。
このようなことをしなければならないときに私が通常行うことは、最初にすべての区切り引用符と(通常は)セミコロンをタブに置き換えることです。
影響を受ける値がどの列にあるかがわかっているので、別の検索を実行して置き換えます。
...コンマ付きの値が3番目の列にある場合。
行の先頭から始まるようにするには、「^」で始める必要があります。次に、([0-9] +)\ tを、そのままにしておきたい列がある回数だけ繰り返します。
([0-9] +)、([0-9] +)は、数値、コンマ、別の数値の順にある値を検索します。
置換文字列では、\1と\2を使用して、編集した行の値を\ t(タブ)で区切って保持します。次に、\ 3 \ 4(間にタブなし)を配置して、数値の2つのコンポーネントをコンマなしで順番に配置します。その後の値はすべてそのままになります。
要素を区切るためにファイルにセミコロンが必要な場合は、次に進んでタブをセミコロンに置き換えることができます。ただし、引用符を省略した場合は、テキスト値にセミコロン自体が含まれていないことを確認する必要があります。そのため、列の区切り文字としてTABを使用することを好みます。
私は通常、RegExpをサポートする通常のテキストエディタ(EditPlus)でこれを行いますが、同じregexpを任意のプログラミング言語で使用できます。