MySQLでtsvにダンプしたりすると制御文字が
\<制御文字>
とエスケープされる。
テキストファイルでは、なるべく1行を1レコードをして扱いたいので、Perlで制御文字をエスケープ文字に変換するスクリプトを書いてみた。
#!/usr/bin/env perl use strict; use warnings; use utf8; binmode STDIN, ":utf8"; binmode STDOUT, ":utf8"; while (my $line = <STDIN>) { while ($line =~ /(?:\A|[^\\])\\\Z/) { $line .= <STDIN>; } chomp $line; $line =~ s/\\\x08/\\b/g; $line =~ s/\\\x09/\\t/g; $line =~ s/\\\x0a/\\n/g; $line =~ s/\\\x0d/\\r/g; $line =~ s/\\\x1a/\\Z/g; print "$line\n"; }
shell> cat foo.tsv | mysqldumpesc > bar.tsv
「\<改行コード>」を「\n」に変換してくれる。
「\n」はMySQLのエスケープ文字なので、変換したデータをそのままインポートすれば、制御文字に展開してくれる。