データファイルを一行ずつ読み込んで、文字列を一文字ずつコンマ区切りにしたいと思っています。たとえば、
xyz → x,y,z
としたいと思っています。
今、data.txt に
abc
defgh
という2行が書いてあります。
perl -nla -e '@chars= split(//,@F[1]); print join(",",@chars);' data.txt
とすると
a,b,c
d,e,f,g,h
という出力が無事に得られました。
どうせ、data.txt は一列しか使っていないので、
@F[0] の代りに $_ を使ってみました。
perl -nle '@chars= split(//, $_); print join(",",@chars);' data.txt
しかし、結果は
a,b,c,
d,e,f,g,h,
のように、各行の最後に余計なコンマが付いてしまいます。
なぜでしょうか?
一列しかデータがないので、@F[0] と $_ は同じだと思っていたのですが、なにか違うのでしょうか?
No.6ベストアンサー
- 回答日時:
ほぼ、既に答が出ているようですが、cygwinのperlでは改行コードを0x0A
で、data.txtはdos形式の改行だからということのようですね。
以下のように入力セパレータが0x0Aで、dos形式のファイルをchompして
も、0x0Dが残ることがわかります。
$ cat check_chomp.pl
#!/usr/bin/perl
use warnings;
use strict;
print "--- Now Return Code\n";
print_char_cord($/);
my $file = shift || 'data.txt';
open my $fh, '<', $file or die "$file: $!";
while ( my $line = <$fh> ) {
print "\n--- Before chomp\n";
print_char_cord($line);
chomp $line;
print "\n--- After chomp\n";
print_char_cord($line);
}
close $fh or die "$file: $!";
sub print_char_cord {
my $str = shift;
while ( $str =~ m/^(.)(.*)/s ) {
printf( "%s = 0x%X\n", $1, ord $1 );
$str = $2;
}
print "\n";
}
$ perl check_chomp.pl ~/tmp/data.txt
--- Now Return Code
= 0xA
--- Before chomp
a = 0x61
b = 0x62
c = 0x63
= 0xD
= 0xA
--- After chomp
a = 0x61
b = 0x62
c = 0x63
= 0xD
--- Before chomp
d = 0x64
e = 0x65
f = 0x66
g = 0x67
h = 0x68
= 0xD
= 0xA
--- After chomp
d = 0x64
e = 0x65
f = 0x66
g = 0x67
h = 0x68
= 0xD
ワンライナーでchompしたいときは、例えば次のように$/を変えてやれば、
OKです。
$ perl -nle '@chars= split(//, $_); print join(",",@chars);' ~/tmp/data.txt
a,b,c,
d,e,f,g,h,
$ perl -nle 'BEGIN{$/="\x0D\x0A"} @chars= split(//, $_); print join(",",@chars);' ~/tmp/data.txt
a,b,c
d,e,f,g,h
$
あっという間に検証用のコードまで・・・すごい・・・。ありがとうございます!
なるほど、
● cygwin perl の改行文字が \n
● windows の改行文字が \r\n
なので、
$/ = "\r\n";
と最初に設定して、削除したい改行文字を設定すればいいのですね!
No.5
- 回答日時:
> しかし、chomp $_ のあとも変化がありません・・・。
chomp は改行文字を削除するものです。改行文字が含まれていない場合、何もしません。
> 下の方のところでもありましたが
> cygwin の perl の問題でしょうか・・・。
私自身は Windows を使っていないのであくまで一般論ですが、data.txt の改行文字が
CRLF で cygwin の Perl の改行文字が LF のみとなっている場合は、今回のような現象
が生じる可能性があるかもしれません。すなわち -nl によって除去されるのは LF のみ
で $_ には末尾に CR が付き、-a によるフィールド分割では CR が空白文字類に含まれ
るので除去される、といった具合です。
No.3
- 回答日時:
文字列の末尾に1つの半角スペースまたはタブが付いているのは考えられると思います。
$_ へはそのまま格納されますが、@F への格納では空白類が捨てられます。$_ と $F[0]
の文字列の長さを確認してはどうでしょうか。
$ perl -nla -e 'print length($_), ", ", length($F[0]);' data.txt
この回答への補足
data.txt には改行が入っていないのですが、、、
確かに length($_) の方が一つ多い値でした。
しかし、chomp $_ のあとも変化がありません・・・。
下の方のところでもありましたが
cygwin の perl の問題でしょうか・・・。
No.2
- 回答日時:
かわらんなあ
---
$ perl -v
This is perl, v5.8.8 built for i386-linux-thread-multi
$ cat /etc/redhat-release
CentOS release 5.3 (Final)
$
$ cat data.txt
abc
defgh
$ perl -nle '@chars= split(//,$_); print join(",",@chars);' data.txt
a,b,c
d,e,f,g,h
$ perl -nla -e '@chars= split(//,$F[0]); print join(",",@chars);' data.txt
a,b,c
d,e,f,g,h
$ perl -nla -e '@chars= split(//,@F[0]); print join(",",@chars);' data.txt
a,b,c
d,e,f,g,h
この回答への補足
あれ、cygwinでやったのが悪いのでしょうか・・
$ perl -v
This is perl, v5.8.7 built for cygwin-thread-multi-64int
(with 1 registered patch, see perl -V for more detail)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- その他(プログラミング・Web制作) pandasでまとめてインデックスを削除するにはどうすればいいですか? たとえば、以下のプログラムで 1 2022/07/31 23:09
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- その他(プログラミング・Web制作) awkのtoupper() 1 2022/10/21 20:39
- UNIX・Linux サーバー間のデータコピー(データ形式とデーターフォーマットの変換あり。一定間隔で処理) 2 2023/08/22 22:15
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- UNIX・Linux Linuxについて質問です。 以下のような設定をしたMakefileを作成するにはどう記述すればよい 1 2023/02/03 20:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlのプログラミング 部分入れ...
-
Strawberry Perl for Windows ...
-
アルファベットに付いて質問し...
-
Perlで同じフォルダにある任意...
-
perlでリテラル値はメモリにど...
-
ペプシコーラとコカ・コーラとD...
-
perlをバージョンアップしたら...
-
openした後、closeしないでプロ...
-
#!/usr/bin/perlで書きだしたCG...
-
Perlのエラーについてご教授く...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
perlで2次元配列をサブルーチ...
-
perlのrequireの動き方について...
-
perlについての質問
-
Blenderについて
-
Perl の外部モジュールの利用方法
-
perl このテキストファイルを簡...
-
Perlでファイルの末尾から指定...
-
秀丸での一括変換について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストファイルで提出とは?
-
openした後、closeしないでプロ...
-
perlをバージョンアップしたら...
-
INDIRECT 横に再度抽出したい
-
Perl の外部モジュールの利用方法
-
Perlで特定文字列から特定文字...
-
Perlのエラーについてご教授く...
-
bashスクリプト
-
Strawberry Perl for Windows ...
-
perlで2次元配列をサブルーチ...
-
TeraPadエディターの操作方法に...
-
アルファベットに付いて質問し...
-
perlのflock関数でロックをかけ...
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
Wallpaper Engineでおすすめの...
-
Perlで時間の計算
-
perlのrequireの動き方について...
-
perlでリテラル値はメモリにど...
-
画像が表示でnull; this.src
おすすめ情報