🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

3回答

3130閲覧

全角バックスラッシュの文字を正規表現で置換したい

sysder

総合スコア25

BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2021/01/10 07:47

編集2021/01/10 11:01

csvファイルのString型の列に「あああ\u0000あああ」のような文字があり、「\u0000」があるとCSVファイルをBigQueryに取り込めないようです。
「\u0000」を空文字にしたいのですが「\u0000」を正規表現でマッチさせることができずにいます。
どのように正規表現で書けば良いでしょうか。
ちなみに「\u0000」はNULL文字だと思い、以下を試したのですがうまくいきませんでした。
(\u0000)
また以下の記述もうまくいきませんでした。
[\u0000]
[\\u0000]

ご教示の程、よろしくお願いいたします。

エラー内容は、以下になります。
Unexpected end of line during parsing a quoted value

エラーが発生している列にはJson形式の値が以下のように入っています。

"{"a":123, "b":"繧ケシシu0000縺"}"

上記の文字化けした状態のCSVファイルからu0000を削除するとエラーがなくなりました。
しかし、文字化けしていないテキストファイルからu0000を削除してもエラーが消えませんでした。
また同様に、「シシu0000」の部分が「\u0000」に該当しますが、
文字化けした状態のCSVファイルから「シシu0000」を削除するとエラーがなくなりました。
しかし、文字化けしていないテキストファイルから「\u0000」を削除してもエラーが消えませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

「\u0000」があるとCSVファイルをBigQueryに取り込めないようです。

無関係でしょう。

Unexpected end of line during parsing a quoted value

というエラーを見る限り、プログラムが適切な文字コードでファイルを読めていないのが読めない原因に見えます。
具体的にはUTF-8のファイルをShift_JISとして読んでいるように見えます。(これはあなたが見ている文字化けと同じものです)

上記の文字化けした状態のCSVファイルからu0000を削除するとエラーがなくなりました。

文字化けした状態のファイルを編集して上書きしたということでしょうか。ファイルの他の部分が破壊されますのであまり意味のある結果にはなりません。
エラーが無くなったのは複数バイトで構成される文字が半端にずれたために化け方が変わったためかと思います。

「シシu0000」の部分が「\u0000」に該当します

いいえ違います。シシの前の1バイトからです。文字化けした状態では一般的に文字の区切りが変化するので元の文字に対応する部分を切り出せるとは限りません。

投稿2021/01/11 12:11

ikadzuchi

総合スコア3047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sysder

2021/01/11 13:31 編集

的確なご指摘ありがとうございます。 文字化けしたファイルを変更しても意味がないのですね。 おっしゃる通り\u0000がエラーの原因ではなく、ファイルをvimで開くと^@があり^@がエラーの原因のようでした。 また、^@を正規表現を使って置換しようとしたところ、正規表現[\x00]でヒットしませんでした。
guest

0

ベストアンサー

全角バックスラッシュは、単なる文字列なので、正規表現とか必要なく、

Python

1foo = foo.replace("\u0000","")

で。

投稿2021/01/10 08:24

otn

総合スコア85882

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sysder

2021/01/10 08:32

ご回答ありがとうございます。 使用しているツールの使用上、正規表現を使わないといけないです。。。
otn

2021/01/10 08:37

ああ、すいません。直前でPythonの質問に回答したので。つい。 では、正規表現として"\u0000"を使えば良いだけです。 特殊文字を含まない普通の文字列も正規表現です。
sysder

2021/01/10 08:45

うまくいきませんでした。 BigQueyのGUI上では「\u0000」と表示されているのですが、違う文字として抽出しないといけないんですかね。
otn

2021/01/10 08:50

ということは、あなたが思っているような、 > csvファイルのString型の列に「あああ\u0000あああ」のような文字があり、 が間違っていると言うことなので、手を抜かず、CSVファイルの中身を、普通のエディターとか、16進表示ツールとかで、ちゃんと確認しましょう。
sysder

2021/01/10 09:03

csvファイルを開いて確認したのですが、「\u0000」と表示されました。
otn

2021/01/10 09:08

そうすると、ツールの使い方を間違っているとかでしょうか。 エディターで開いて表示されたものをそのままコピペしていないとか。
sysder

2021/01/10 10:11 編集

ツールの使い方は問題ありませんでした。 また、「\u0000」を削除して取り込みを開始したところエラーで取り込みがうまくいきませんでした。 csvファイルをテキストで開いてみたところ、「\u0000」が含まれている値の途中で改行されているようでした。 この改行は、テキスト上でdeleteできないですか?改行のところでキーボードからdeleteすると、文字が削除されます。
sysder

2021/01/10 10:21

すみません、原因がはっきりしないので一旦保留にさせてください。
sysder

2021/01/10 10:29

ちなみにエラー内容は、以下になります。 Unexpected end of line during parsing a quoted value
otn

2021/01/10 10:35 編集

> また、「\u0000」を削除して取り込みを開始したところ ようやく、削除は成功したと言うことですかね? > この改行は、テキスト上でdeleteできないですか? 改行を削除したいのであれば、すればいいと思います。 > 改行のところでキーボードからdeleteすると、文字が削除されます。 それはエディターがおかしいか、うまく使えてないのか。 > Unexpected end of line during parsing a quoted value CSVは、" "で囲めばその中に改行をデータの一部として入れることが出来ますが、お使いのツールがそれに対応してないと言うことですね。
sysder

2021/01/10 10:56

> ようやく、削除は成功したと言うことですかね? はい。「\u0000」の削除はテキストファイルから手動で行いました。しかしエラーが消えませんでした。 質問のところに追記させていただいたのですが、文字化けした状態のCSVファイルからu0000を削除するとエラーがなくなりました。 しかし、文字化けしていないテキストファイルからu0000を削除してもエラーが消えませんでした。
sysder

2021/01/10 12:43

黒い六角形の中にはてな文字が書いてあるものがあったのですが、これは\ufffdでしょうか。 これが邪魔しているようです。
sysder

2021/01/10 12:55

はてなの文字をvimで開いたら「^@」となりました。
otn

2021/01/10 14:48

> 黒い六角形の中にはてな文字 フォントに無い文字と言うことですかね?エディタの仕様に依りますが。 16進表示して、文字をちゃんと調べるのでしょうか。 何らかのプログラムを作って、それで処理して、ファイルをきれいにする必要がありそうです。
otn

2021/01/10 15:39

いいえ、間違ってます。^@ は \x00 です。 繰り返し書きますが、16進表示して、内容を確かめましょう。
sysder

2021/01/10 17:21

vimで:%!xxdをやって16進に変換すると000aになりました。 しかし、wikipediaの記載によるとおっしゃる通り^@はNULL文字で\x00でした。 [\x00]で^@を抽出しようとしたのですが、抽出されませんでした。
otn

2021/01/11 00:55

「^@改行」で、000a です。 > [\x00]で^@を抽出しようとしたのですが、抽出されませんでした。 自分でプログラムを作るしか無いのでは?
sysder

2021/01/11 10:52

>「^@改行」で、000a です。 なるほど。そうなんですね。 そうですね。自分で抽出プログラムを作ることを検討します。 ご丁寧にありがとうございました。
guest

0

全角スラッシュはメタ文字ではなく普通の文字ですから、\u0000と普通に書けばいいだけですね。

投稿2021/01/10 07:51

KojiDoi

総合スコア13692

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sysder

2021/01/10 08:04

ご回答ありがとうございます。 普通にというのは、(\u0000)でしょうか。これでもうまくいきませんでした。
KojiDoi

2021/01/10 08:34

どううまくいかなかったのですか。エラーが出た? 変な形に変換された? 何もおこらなかった?
sysder

2021/01/10 08:37

マッチしませんでした。
sysder

2021/01/10 08:38

[\xFFE5](u0000)や[\uFFE5](u0000)でもだめでした。
KojiDoi

2021/01/10 08:44

そのカッコは何のためにつけているのですか?
sysder

2021/01/10 08:53

[]は全角バックスラッシュを抽出、()はu0000を塊で抽出です。
KojiDoi

2021/01/10 09:18

[]に抽出などという機能はありませんよ。 質問文が間違っていないとすれば、文字列としての\u0000は間違いなく対象にマッチする正規表現にマッチするはずです。ということは質問文に書いてないどこかに不備があるのでしょう。正規表現を与える場所が間違っているとか、そもそも全角バックスラッシュと思い込んでいたものがそうでないとか。
sysder

2021/01/10 10:09

すみません、「\u0000」を削除して取り込みを開始したところ、エラーで取り込みがうまくいきませんでした。 csvファイルをテキストで開いてみたところ、「\u0000」が含まれている値の途中で改行されているようでした。
sysder

2021/01/10 10:18

[]について調べたのですが、理解が怪しいようです。 []は[]に含まれる文字が、一つ一つマッチングするのではないですか? [ai]と書くとakgmiという文字列からaとiを抽出するという理解でした。
KojiDoi

2021/01/10 10:26

>[ai]と書くとakgmiという文字列からaとiを抽出するという理解でした。 ちがいます。[ai]は「aまたはi」です。
KojiDoi

2021/01/10 10:28

>「\u0000」が含まれている値の途中で改行されているようでした。 改行もひとつの文字です。それが途中に挟まっているのであれば、マッチは当然成立しません。
sysder

2021/01/10 15:25

>ちがいます。[ai]は「aまたはi」です。 ということは、xy[ai]と正規表現で書いた時、xyaとxyiがヒットするということでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問