• ベストアンサー

<IN>のx行目を操作したい

leaz024の回答

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

こんな感じでよいのでは?  open IN, $file or die;  while (<IN>) {    if ($. == $x) { chomp($line_x = $_); }    elsif ($. == $n) { chomp($line_n = $_); }  }  close IN;  print $line_x;  print $line_n; 改行除去は必要に応じて行ってください。

ryogoku
質問者

お礼

解決することが出来ました。 ありがとうございました。

関連するQ&A

  • ファイル操作について

    別スレ立てているので、ルール違反になっちゃいますかね? もしそうであればゴメンナサイ… sub fanc{ my @array = @_; my $ag = shift @array; my $n1 = 'AAA.csv'; my $n2 = 'BBB.csv'; my $n3 = 'CCC.csv'; my $n4 = 'DDD.csv'; my $n5 = 'EEE.csv'; ・ opendir(DIR, "C:/Program Files/Apache Group/Apache2/cgi-bin/test");my @pairs = readdir(DIR); close(DIR); if($ag == 1){@files = grep(/$n1/,@pairs); } if($ag == 2){@files = grep(/$n2/,@pairs); } if($ag == 3){@files = grep(/$n3/,@pairs); } if($ag == 4){@files = grep(/$n4/,@pairs); } if($ag == 5){@files = grep(/$n5/,@pairs); } if($ag == 6){@files = grep(/$n6/,@pairs); } ・ $dfile1 = $files[0]; open(IN,"$dfile1") or exit; chomp(my $row01 = <IN>); chomp(my $row02 = <IN>); chomp(my $row03 = <IN>); chomp(my $row04 = <IN>); chomp(my $row05 = <IN>); chomp(my $row06 = <IN>); ・ close(IN); my @col01 = split(/,/, $row01); my @col02 = split(/,/, $row02); my @col03 = split(/,/, $row03); ・ ・ こういったコードをもっと短く、書くやり方を知りたいです。 grepでヒットするのが複数の場合もあるため、当初はForeach文とフOpenで配列@filesに入った ファイルを全て展開して、配列、又は変数に格納しようと思ったのですが、どうやって複数の配列をOpen関数で扱えばいいのか解りません。 もしそうでなければ、現在は一つのファイルに対しての処理ですが、残ったファイルに関しても関数を回す方法があれば、ご教授願えませんか??あ、あと、CODE(xxxxxx)ってなんのことでしょう?

    • ベストアンサー
    • Perl
  • (x 行処理されました)を表示させないのは可能か

    クエリアナライザ、sqlcmdなどでselectを実行した場合、処理結果レコードの最終行の後に(x 行処理されました)が必ず表示されてしまうのですが、表示させない方法をご存じの方、ご教示いただけないでしょうか。 select結果をテキストファイル出力したものをそのままプログラムで使用したいのですが、最終レコードの後に(x 行処理されました)の行など数行が余分にあるため、毎回テキストファイルを開いて手作業で消さなくてはならず、困っております。

  • csvデータの開始行と最終行を全体の4分の1で区切り処理をしたい

    csvデータの開始行と最終行を全体の4分の1で区切り処理をしたい csvデータの開始行と最終行を全体の4分の1で区切り処理をしたいと思ってます。 csvファイルは20万件あります。4分の1なので1~50000件となります。 今回は50001~100000件までを行いたいのですが、先日教えていただいたwhile($lines = <IN>) ですと、最初から1件ずつ最終行まで処理をしてしまいます。 (ここから) open(OUT,">$csv"); open(IN,"$data") || &error(" $data を読み込みopen出来ません"); while($lines = <IN>) { ($seq1,$categ,$password,$imail,$cont) = split("\,", $lines); $cont .= " "; $data = "$seq1,$cont,1\n"; print OUT "$data"; $data = ""; } close IN; close OUT; (ここまで) 今回は20万件ですが、毎回このデータ量は月次ごとに変わります。 while周辺をいじるような気がしていますがどのようになるのかがわからなかったので質問いたしました。 お手数かけます。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • in_array

    $a=array("あ"); $b= "あ" $c=in_array($a,$b) if( この処理の時に、あの前と後の値を指定したい場合なんて書きますか? (2)あが2つ連続であった場合は違う処理をしたいです。その場合どう書けば良いですか?

    • ベストアンサー
    • PHP
  • 1行がやたら長いテキストをバッチ・コマンドから操る

    こんにちは。 batファイル、コマンドプロンプトからファイルを操作するとき、1行がやたらと長いファイルが扱えなくて困っています。 びっしりとタグが書かれたテキストファイルなのですが、このファイルの中の /> を >\n (「\n」は改行)として事前に置き換え処理をすることはできるのでしょうか。改行を入れてやれば、後処理でループするときに楽になるのですが。 もしくは、1行が異常に長くても処理できる方法などあるでしょうか? for /f を使うと正しく反応してくれません。1行でメガ単位あるテキストなんですが・・・

  • grep関数を用いた複数行からの抽出

    同じ行で重複した単語を削除したいです。 テキストファイル sapporo aomori akita iwate akita yamagata sendai miyagi hukushima miyagi akita mito ・ ・ 上記のようなファイルの同じ行で重複した単語を削除し下の形にしたいです。 sapporo aomori akita iwate yamagata sendai miyagi hukushima akita mito ・ ・ open(FILE1, "<xxx.txt") || die "File1 Open Error! \n"; open(OUT, ">zzz.txt") || die "OUT Open Error! \n"; $string1 = <FILE1>; my @array = split(/\t/,"$string1"); my %count; @array = grep {!$count{$_}++}@array; foreach my $element (@array) { print OUT "$element\t"; } close(FILE1); close(OUT); このプログラムを実行すれば初めの一行は重複した単語を削除できるのですがそこで終了してしまいます。2行目、3行目・・といったように複数行に対して重複した単語を削除するためにはどのようにすればいいのですか。宜しくお願いします。

    • ベストアンサー
    • Perl
  • マッチした行をランダムに3行出力したい

    毎度お世話になっております。 今夜も躓いてしまってどうにもならないので、お力をお貸しいただけませんでしょうか。 以下のようなリストファイルがあります。 ------------------ 項目1 項目2 ・・・ ------------------ このリストにマッチした行を、リストの項目ごとにランダムに3行選んで出力したいです。 マッチした行を取り出すところまでは、以下のような形でできたのですが、 ここから先をどのように書けばいいのかわかりません。 ------------------ my $list = 'リストファイル'; open (IN, "$list"); my %l; while(<IN>) { chomp; $l{$_}++; } close IN; while(<DATA>) { my ($xx,$yy) = split(/\t/,$_); if (exists($l{$xx})) { # print; # ここから先がわかりません } } __END__ 項目1 N1 項目1 N2 項目2 N3 項目2 N4 項目2 N5 項目1 N6 項目2 N7 項目2 N8 項目2 N9 項目1 N10 ------------------ 以下のような出力結果にしたいです。 ------------------ 項目1 N2 項目1 N6 項目1 N10 項目2 N3 項目2 N5 項目2 N9 ------------------ どうぞよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • ソートすると最初の1行が消えてしまいます!

    いつも大変お世話になります。初心者の質問で申し訳ありません。 #!/usr/bin/perl # re-shuffle open OUT, ">file2"; open IN, "file1"; while (<IN>){ print OUT sort{&span($a) <=> &span($b)}(<IN>); } close OUT; close IN; ### sub span{ というふうに、file1から1行ずつ読み込んで、spanで規定する値で行を並べ替えてfile2を作るようにしたつもりですが、file2の最初の1行?が消えてしまいます。どこに問題があるのでしょうか、教えてください。あるいはまだ情報不足でしょうか?

    • ベストアンサー
    • Perl
  • 行の操作

    ファイルから行を読み込み、それに順じて行をソートするプログラムを作りたいのですが、ちょっと混乱しています。ファイルは、以下のようになっています。 abcedf 0.53343 efghij 0.09473 klmnop 0.23453 . . . これをスコアとして行ごとに並べ替えようと思っています。以下のようなプログラムを考えたのですが、まず配列の格納がうまくいきません。よろしくお願いします。 main(){ int i, j; char line[50], name[50]; double *sor,tmp; FILE *qqq; sor=(double*)malloc(sizeof(int*)*Y); qqq = fopen("score_sort.txt","r"); //行単位の操作 while (fgets(line ,15, qqq) != NULL) { sscanf(line,"%s %f",name ,sor); } for(i=0;i<Y;i++) printf("sor[%d]=%f\n",i,sor[i]); return 0; fclose(qqq); }

  • Excel(VBA)で配列の要素数を調べるには?

    お世話になります。 ExcelのVBAで、split関数を使って配列に格納したデータの要素数を調べる方法がわかりません。 下記のようなコードで、読み込んだデータを配列(Arraydata)に格納することは出来たのですが、test.csvの要素数が処理の度に変わるため、要素数に応じて後続の処理を行ないたいと考えています。 Open test.csv For Input As #1 ' test.csvファイルを開く Line Input #1, test.csv ' データ行を読み込む Arraydata = Array(Split(test.csv, ",")) ' 配列に格納 よろしくお願いします。