UNIX:テキストファイルのNULLを空白に変換する方法

このQ&Aのポイント
  • テキストファイルのNULLを空白に変換する方法を調査しています。
  • Oracleデータベースにテキストファイルを取り込む処理を開発していますが、ORA-01722エラーが発生しました。
  • sedやawk、perlを使用してNULLを空白に変換する方法を知りたいです。
回答を見る
  • ベストアンサー

UNIX:テキストファイルのNULLを空白に変換したい。

お世話になります。 現在テキストファイルをOracleデータベースに取り込む処理を開発しております。SQL*Loaderを用いて、テスト.datを取り込もうとしたのですが、 ORA-01722: 数値が無効です。エラーが出てデータを取り込めません。 テスト.datの中身を見たところ、該当個所に下記のようにNULLが入っていました。 数値型のテーブル項目に、NULLを取り込もうとしてエラーになっています。 Oracleの場合、数値型では空白は取り込めるようですが、NULLは取り込めないようです。 ですので、テスト.datのNULLの個所を空白に変換する方法を調査しています。 sedや、awk、perlを使えばできるのでしょうが、私は詳しくないため 方法が思いつきません。 どなたか、sed、awk、perlに詳しい方がいれば、方向性のヒントだけでも お教えねがいますでしょうか。 環境: Solaris 9 ■テスト.dat od -c テスト.dat > テスト.txt ※ \t = タブ、\0= NULL $ head -10 テスト.txt 0000000 0 0 1 \t 0 1 0 1 \t 1 \t 0 1 0 1 \t 0000020 0 0 0 0 0 0 \t 0 3 7 \t 1 0 0 1 0 0000040 2 8 \t \0 \0 \0 \t \0 \0 \0 \0 \0 \0 \0 \0 \0 0000060 \0 \t \0 \t 0 0 \t 6 3 \t 0 0 \t 1 \t ■編集後のイメージ \0(NULL)の個所を、そのままスペース(空白)で置き換えたい。 0000000 0 0 1 \t 0 1 0 1 \t 1 \t 0 1 0 1 \t 0000020 0 0 0 0 0 0 \t 0 3 7 \t 1 0 0 1 0 0000040 2 8 \t   \t 0000060 \t \t 0 0 \t 6 3 \t 0 0 \t 1 \t よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

以下のようなperlのスクリプトを作ってください。 ----------------------------------- open FH, $ARGV[0] or die "open error $!"; while(read FH,$data,1){ $data =~ tr/\x00/\x20/; print $data; } close FH; --------------------------------- 上記のスクリプトのファイル名を conv.pl とします perl conv.pl テスト.dat > テスト.dat2 とすると テスト.dat2が作成されます。(NULLをスペースに変換したファイル)

gou2199
質問者

お礼

お世話になります。 教えていただいた方法で、目的のファイルを作成でき、 無事Oracleに取り込むことができました。 Perlって便利ですね。 これから勉強しようと思います。 非常に助かりました。 tatsu99さん、ありがとうございました。

関連するQ&A

  • バッチファイルでテキストファイルを分割したい

    テキストファイルを、指定した数値の倍数の行を、指定した個数に分割するバッチファイルを作成しようとしています。 例えば、以下の様な内容の「in.txt」というテキストファイルを3分割したい場合、 ----- in.txtの内容 ----- 1 2 3 4 5 6 7 8 9 10 ------------------------ 以下の様な内容で、 「out1.txt」「out2.txt」「out3.txt」として出力したいのです。 ----- out1.txtの内容 ----- 1 4 7 10 -------------------------- ----- out2.txtの内容 ----- 2 5 8 -------------------------- ----- out3.txtの内容 ----- 3 6 9 -------------------------- 自分はプログラミングの知識がないので、WEBに書かれている構文を少し書き換えたりして試しているのですが、うまく行きません。 AWKを使い、以下のようなバッチファイルを作成して実行してみましたが、「out3.txt」だけがうまく行きませんでした。構文の意味も分からないので修正も出来ません。 awk "NR%%3==1" "in.txt" > "out1.txt" awk "NR%%3==2" "in.txt" > "out2.txt" awk "NR%%3==3" "in.txt" > "out3.txt" AWKの解説ページを読み始めたのですが、時間的な猶予があまり無く、今回質問させて頂いた処理が出来るようになるまでまだ時間が掛かりそうなので、どなたかお分かりの方がおられましたお教え頂けないでしょうか。 AWKでなくとも、sedでもPerlでもその他のコマンドでも構いませんし、スクリプトファイルを読み込めるコマンドでしたらスクリプトでの書き方でも結構ですので、ご存知の方がおられましたらお教え頂けないでしょうか。

  • 参照ファイルを用いて、複数のテキスト置換を一括で行

    参照ファイル(list.txt)を用いて、一括でファイルの中身(test.txt)を置換したいです。以下のようにワンライナーで書いたのですが、以下のようなエラーが出ました。 使っているのはMac Os10.15.5です。 何か問題があるのでしょうか? 間違っている点があれば教えていただきたいです。 sed 's/\([^\t]*\)\t\(.*\)/s|\1|\2|g/' list.list | xargs -I{} sed -i '{}' test.txt sed: 1: "/Users/owner/Desktop/DI ...": invalid command code o sed: 1: "/Users/owner/Desktop/DI ...": invalid command code o <list.txt> AAA aaa 111 222 abc efg ....

  • UNIX系の文章処理についてのご質問

    UNIX系での文章処理方法について、ご教授願います number150=Test(A,B); が記述されているテキストファイルtest1.txtを number150 =Test(number150_1,number150_2); と出力(test2.txt)をさせたいのですが、 sed "s/A/{print $1}/g" test1.txt > test2.txt というふうにしてみましたが、うまくいきませんでした。awkも参考にトライしてみましたが失敗しました。 ちなみに s/A/number150/gと直接指定しない(number150は一例でnumber200や他の場合もある)でうまく文章処理を行いたく質問させていただきました。 ご存知の方、ご教授願います。

  • NOT NULL制約がついた項目のUPDATEについて

    基本的な事で申し訳ありません。 Oracle10g を使用していますが、 SQLのUPDATE文で主キーではない、 NOT NULL 制約がついたVARCHAR2(30)の項目を ''(ブランク)で更新しようとした所エラーが返されました。(ORA-01407) NULLで更新するのではないから大丈夫かと思っていたんですが、 NOT NULL 制約がついているとブランクでも更新ができないのでしょうか?

  • 行頭と行末に文字追加

    文字変換がうまくいきません。 sedとawkもしくはperlを使ってなんとかならないでしょうか? 行の行頭と行末を " で囲みたいのですが。 ------test.txt----- abc cde fgh hijk lm nopq rstu vwx y z ------test.txt---- 以下のように。 "abc cde fgh" "hijk lm" "nopq rstu vwx y z" よろしくお願いします。

    • ベストアンサー
    • Perl
  • 表領域の作成について

    表領域を作成してインポートしたら下記のエラーが出力されて困っています。 表領域の作成の仕方が駄目でエラーが出力されてしまったのでしょうか。 下記のCREATE TABLESPACE文で表領域を作成しています。 ---------------------------------------------------------------------- CREATE TABLESPACE "T_DAT" BLOCKSIZE 8192 DATAFILE 'D:\oracle\oradata\ora92\DAT_01.DBF' SIZE 32767M, 'D:\oracle\oradata\ora92\DAT_02.DBF' SIZE 32767M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M SEGMENT SPACE MANAGEMENT AUTO; ---------------------------------------------------------------------- コマンドプロンプトでimpコマンドを実行したら、下記のエラーなどが出力されました。 ---------------------------------------------------------------------- IMP-00003: Oracleエラー1659が発生しました。 ORA-01659: nを超えるMINEXTENTSを表領域T_DATに割当てできません。 IMP-00003: Oracleエラー1658が発生しました。 ORA-01658: 表領域T_DATにセグメント用のINITIALエクステントを作成できません。 ---------------------------------------------------------------------- 何がいけないのかが正直わかりません。 申し訳ありませんがアドバイスいただけませんでしょうか。 宜しくお願いします。

  • 再びLinuxでテキストファイルの改行を解除

    http://okwave.jp/qa/q8956601.html での質問の内容ですが、さらなる回答がつきにくいようですので、再質問とします。 awk '(/^.+$/){printf("%s",$0)}(/^$/){print}' < input.txt > output.txt で前の行との間に空白行をはさむ箇所のみ改段落とみなして段落変更をそのままにする、 という処理はできました。 さらに、前の行との間に空白行をはさんでおらず行頭で全角または半角のインデントがされているのみ、 の段落変更の部分も改行を解除せずに段落変更がされた状態を保ち、 残りの箇所のみ改行を解除するためにはどうすればよろしいでしょうか? どうぞよろしくお願いいたします。

  • sambaで連携したファイルをLinuxからsedでの置換

    お世話になります。 sedを使って文字列の置換をしたいと考えています。 sambaでwindowsから連携したファイルに対して置換を行いたいのですが、うまく置換ができません。 Linux側の「GNOME端末」からファイルの中身をのぞくと、全角の箇所が文字化けしてしまっていました。どうやら原因はこれだと思うのですが、どうすれば文字化けしていてもうまく置換できるでしょうか? あるいはLinux側から見ても文字が化けないようにするにはどうすればよいでしょうか? 例)   test[Tab]2008年5月05日[Tab]あああ[Tab]aaaaa という文字列に対し、 sed -e 's/^.*\t.\(.*\)\t.*\t.*$/3\1/' test.txt というコマンドを実行したが、うまく置換されない。 ※test.txtは、文字列が格納されているファイル。 よろしくお願いいたします。

  • 履歴ファイルの削除方法?

    履歴ファイルを filename_YYYYMMDDhhmmss.dat という名前で作成しています。 今日から日付で4世代以前のファイルを削除したい場合(最新3世代を残す)、 どのようにすればよいのでしょうか? 削除は、シェルスクリプト(b shell)で行います。 perl,awkは使わないでお願いします。 例 test_new.dat ←残る (削除対象外) test_old.dat ←残る (削除対象外) test_old.dat_20060610000000 ←消える test_old.dat_20060610000001 ←消える test_old.dat_20060611000000 ←消える test_old.dat_20060611000001 ←消える test_old.dat_20060612000000 ←消える test_old.dat_20060612000001 ←消える test_old.dat_20060613000000 ←残る (3世代目) test_old.dat_20060613000001 ←残る (3世代目) test_old.dat_20060614000000 ←残る (2世代目) test_old.dat_20060614000001 ←残る (2世代目) test_old.dat_20060615000000 ←残る (1世代目) test_old.dat_20060615000001 ←残る (1世代目)

  • UNIX のシェル 文字の置換について

    シェルでファイルの文字列を置換したいです。 /*~*/のコメントの文字なので、1行数を変えたくないです。 ─────────────────────────── ※1文字分の空白を「_」で表示します。 test.txtファイルの「XXXXX」を「aa___」に置換する。 ─────────────────────────── 【test.txt 置換前】 /**************/ /*_XXXXXYYYYY_*/ /**************/ 【シェルの内容 test.sh】 #!/bin/csh set IN_henkan = `printf "%-5s" $1` perl -i -p -e 's/XXX/'$IN_henkan'/g' test.txt 【シェルを実行】 test.sh aa 【test.txt置換前 希望する状態】 /**************/ /*_aa___YYYYY_*/ /**************/ 【test.txt置換前 実際の状態】 /**************/ /*_aa_YYYYY_*/ /**************/ ─────────────────────────── 「aa」の後ろに1文字分の空白しか挿入されないです。