• ベストアンサー

条件部分の行だけ取り出すPerlが動きません(DOS窓)

------------------------------------ c:\work\a.bat c: cd \work convert.pl sample.html convert.pl sample1.html convert.pl sample2.html … ------------------------------------- c:\work\convert.pl $infile=$ARGV[0]; $outfile=$ARGV[0]; # 変換後ファイルは、拡張子をtxtにして区別 $outfile=~ s/\.html/\.txt/; # ファイルを開く open( IN, $infile ); @xx = <IN>; close(IN); # 抽出行の先頭行番号を取得 $i=0; for (@xx) { if ($xx[$i]= ~ /Array/){ $start = $i; last; } $i++; } # 抽出行の最後行番号を取得 for ($j = $start; $j <= 100; $j++) { if ($xx[$j]= ~ /\)\;/){ $end = $i; last; } $j++; } # 書き込み用にファイルを開く open( OUT, "> $outfile" ); for ($k = $start; $k <= $end; $k++) { print(OUT $xx[$k]); } # ファイルを閉じる close( OUT ); ------------------------------------- c:\work\sample.html <html> <head> <script type="text/JavaScript"> <!-- sample(); var a = new Array("ああああ", "いいいい", "うううう"); var b = new Array("ええええ", "おおおお", "おおおお"); function init(){ } --></script> </head> <body onload="init();"> </body> </html> ------------------------------ というようにファイルを作り、a.batを実行すると、 htmlファイルのvar aに該当する行(sample.htmlの場合、6~8行目)だけ 取り出して別ファイルに吐き出すようなプログラムを作ってみたのですが、 うまく動きません。 なお、単純にforeach文で@xxをoutfileに出力するのはできました。 部分だけ取り出そうとすると失敗しました。 どこを直せばいいのでしょうか?

noname#63992
noname#63992
  • Perl
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

なんかややこしいスクリプトなんで、読み間違ってたら申し訳ないんだけど、 最初に現れたArrayからその後の最初に現れた);までの範囲を 切り出したいと言う話なら、 #!/usr/bin/perl # -*- coding: utf8 -* use strict; use warnings; use Fatal qw(:void open close); use feature ':5.10'; while (<>) { my $cond = /Array/../\);/; print if ($cond); last if $cond =~ /E0$/; } こんなんとか。 Arrayと);に挟まれた部分全部という話なら while (<>) { print if /Array/ .. /\);/; } で。 ファイル名の付け替えとかその辺は面倒なので省略。

noname#63992
質問者

お礼

無事、別ファイル出力までできました。ありがとうございました。

その他の回答 (1)

  • hkd9001
  • ベストアンサー率48% (99/204)
回答No.1

こんにちは。 # 抽出行の最後行番号を取得 for ($j = $start; $j <= 100; $j++) { if ($xx[$j]= ~ /\)\;/){ $end = $i; …… この「$end = $i;」、正しくは ---------------------------- 「$end = $j;」 ---------------------------- ではないでしょうか。

noname#63992
質問者

補足

すみません、おっしゃるとおりです。間違ってました。 直してみたのですが、動きませんでした。

関連するQ&A

  • CSV取込みで最終行を取り込まない方法

    CSVの取込みで1行目のヘッダーと最終行のフッターを取り込まず 2行目~最終行の前までの中身だけを取り込みたいのですが、 1行目をスキップする方法は、下記を参照にしてなんとかできましたが、 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1230200277 ここに最終行をはぶくという処理をいれるにはどういたらいいでしょうか? ---------------- Private Sub コマンド0_Click() Dim FSO As Object Dim InFile As Object Dim Outfile As Object Dim CsvPath As String Dim WorkPath As String Dim i As Long Const skipRow = 1 ''1行読み飛ばしの1 ''元のCSVファイルのフルパスに変更して! CsvPath = "C\JPデータ取込CSV.csv" ''新しく作るCSVファイル。このMDBがあるフォルダにWork.csv 名で作られます。 WorkPath = CurrentProject.Path & "\Work.csv" '' FileSystemObjectのセット Set FSO = CreateObject("scripting.FileSystemObject") Set InFile = FSO.OpenTextFile(CsvPath, 1) Set Outfile = FSO.createTextFile(WorkPath) '' 読み飛ばし設定 For i = i To skipRow InFile.SkipLine Next i ''新しいCSVファイル作成 Outfile.Write InFile.ReadAll ''CSVファイルの終了と解放処理 Outfile.Close InFile.Close Set Outfile = Nothing Set InFile = Nothing ''Work.CSVファイルのインポート(今のDocmd以下をコピーし、ファイル名等を変更!) 'DoCmd.TransferText ・・・・・・ DoCmd.TransferText acImportDelim, "JPご清算書インポート定義", "T01_JPご精算書", WorkPath, True ''使用済みのWork.CSVを削除 FSO.DeleteFile WorkPath ''FileSystemObjectの解放 Set FSO = Nothing MsgBox "取り込み完了" End Sub

  • 【PHP】CSVファイルの特定行を書き出す

    PHPでCSVファイルを読み込み、特定行のみを別のCSVファイルに書き出したいと思います。 作りたいものは、 http://example.com/file.php?repert=5 とすると、「002.csvファイルの5行目のみ」を「003.csv」に書き込むというものです。 下記で作りましたが、 Parse error: syntax error, unexpected end of file in C:\xampp\htdocs\file.php on line 32 になります。 指摘された32行は ?> の行です。 ググると改行コードのトラブルのようでしたのでCR+LF CR LF と試しましたが、改善されません。 どこが不味いかご教示戴けませんでしょうか? 宜しくお願い致します。 <?php $repeat = $_GET['repert']; $inFile = '002.csv'; // 抽出元ファイル $outFile = '003.csv'; // 結果ファイル $inFp = fopen($inFile, 'rb'); $outFp = fopen($outFile, 'w'); while ($data = fgetcsv($fp, 10000)) { if ($count == $repeat) { { $outLineArray = array( 0 => $data[0], 1 => $data[1], 2 => $data[2] ); fputs($outFp, implode(",", $outLineArray) . ""); } } fclose($inFp); fclose($outFp); exit(); ?>

    • 締切済み
    • PHP
  • AS3.0ですが、下記2つのコードの違いがわかりません。。

    AS3.0ですが、下記2つのコードの違いがわかりません。。 ↓こちらのコードは undefined になるのですが、 --------------------------------- var box:Array = new Array(); for(var j=0; j<1; j++){ for(var i=0; i<10; i++){ box[j] = new Array(); box[j][i] = i+j; } } trace(box[0][0]); ----------------------------------- ↓こちらのコードは値をとることが出来ます。 ----------------------------------- var box:Array = new Array(); for(var k=0; k<10; k++){ box[k] = new Array(); } for(var j=0; j<1; j++){ for(var i=0; i<10; i++){ box[j][i] = i+j; } } trace(box[0][1]); ----------------------------------- どういう理由で、値が取れるのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • テキストファイル中の文字列を書き換えるスクリプトを書きたい

    テキストファイルの文字列を書き換えるスクリプトを考えています。 今、次のところまで出来るようになりました。本当は「こんにちは」の文字列を全て「HELLO」に置換したいのです。現在は一行の中で最初の「こんにちは」は置換されますが、2番目以降が置換されません。同じ行中の2番目以降も置換するには、どうしたら良いでしょうか? <置換前ファイル:sample.txtの中身> こんにちはこんにちはこんにちはこんにちは こんにちは こんにちは <置換前ファイル:sample.txtの中身> HELLOこんにちはこんにちはこんにちは HELLO HELLO <置換スクリプト> Set fso = CreateObject("Scripting.FileSystemObject") Set regEx = New RegExp Set inFile = fso.OpenTextFile("C:\static\sample.txt") Set outFile = fso.CreateTextFile("C:\static\sample1.txt") regEx.Pattern = "こんにちは" repStr = "HELLO" Do Until inFile.AtEndOfStream tempLine = inFile.ReadLine repLine = regEx.Replace(tempLine, repStr) outFile.WriteLine repLine Loop inFile.Close outFile.Close

  • [perl5.8] SJISで出力したはずのファイルにutf8フラグが

    1)SJISで以下の2行を含むファイルを作成し、   sjis.txtという名前で保存します。 "ホツカイドウ" "北海道" 2)SJISで以下のスクリプトを作成します。 #=== one.pl === use encoding 'Shift_JIS'; use open IN => ":encoding(Shift_JIS)"; use open OUT => ":encoding(Shift_JIS)"; my $infile = 'sjis.txt'; my $outfile = 'sjis2.txt'; open(IN, "<$infile"); @lines = <IN>; close(IN); open(OU, ">$outfile"); print OU @lines; close(OU); 3)SJIJSで以下のスクリプトを作成します #=== two.pl === use encoding 'Shift_JIS'; use open IN => ":encoding(Shift_JIS)"; use open OUT => ":encoding(Shift_JIS)"; my $infile = 'sjis2.txt'; my $outfile = 'sjis3.txt'; open(IN, "<$infile"); @lines = <IN>; close(IN); open(OU, ">$outfile"); print @lines; close(OU); 4)one.pl を実行し、続いてtwo.plを実行すると 以下のエラーがコマンドプロンプトに表示されます。 #------------------------------------------- D:\zipcode\utf8mondai>two.pl Wide character in print at D:\zipcode\utf8mondai\two.pl line 14. "・趣セゑスカ・イ・・セ橸スウ" Wide character in print at D:\zipcode\utf8mondai\two.pl line 14. "蛹玲オキ驕・ これは何故なのでしょうか。 エラーメッセージは、printしようとしている 文字列にutf8フラグがついているという意味 らしいです。

    • ベストアンサー
    • Perl
  • データファイル中のデータをランダムに整列させる方法

    横70文字縦100文字のデータを横X文字のデータを縦にY行整列させ、その結果をもとのファイルに上書きするプログラムを作成しようとしています。横X文字のデータは最初のデータのどこをとってもよく、他の行の一部とかぶってもいいです。X、Yはランダムです。横にX文字ファイルに上書きしたら、またランダムなX文字を次の行に上書きします。かなり考えましたが、作成したプログラムがうまくいきません。どなたか教えてください。よろしくお願いします。 #! /usr/bin/perl my $filename = "reference.fasta"; open FILE, "+< $filename" or die "$!"; my $tmp; my $count = 0; while(my $c = getc FILE){ next if($c eq "\n"); $array[$count] = $c; $count++; } for($j=0;$j<50;$j++){ $var = int(rand 50); for($i=0;$i<$var;$i++){ # print FILE $array[$j][$i]; $tmp .= $array[$j][$i]; } print FILE $tmp, "\n"; } close FILE;

    • ベストアンサー
    • Perl
  • 不規則な配列を読む方法

    質問です。 以下のようなcsvファイルを読み込む際に a , b , c d , e , f , g h , i , j k , l , m , n , o <プログラム> var data1 = new Array(); var data2 = new Array(); var data3 = new Array(); var i = 0; do{ data1[i] = objTxt.ReadLine(); data2[i] = data1[i].split(","); data3[i] = Array(data2[i][0] ,data2[i][1] ,data2[i][2] ,data2[i][3] ,data2[i][4]); i = i + 1; }while(!objTxt.AtEndOfLine) といった具合に読んでしまうと、data2[0][4]など ないところのデータまで無理矢理よんでしまうことになります。 undefinedと表示され、使うぶんには困らないのですが、 うまく必要な場所までよむことって可能でしょうか? つまり上の例だとdata2[0][2]まで、次の行はdata2[1][3]まで といった具合です。 もし、方法がありましたら、どなたかお教え願います。

  • 行・列の整理! perl

    perlでデータを並び替えて整理したいです。 【元データ】 A a b A c d A e f A g h B i j B k l B m n C o p C q r C s t C u v ・ ・ ・ 上記のデータを下記のように並び替えしたいのですが上手くできずに困っています。 どのような記述をすれば良いのでしょうか。間の空白はタブ区切りです。 【目標】 A a b c d e f g h B i j k l m n C o p q r s t u v D ・ 現在、元データから A B C D ・ ・ というデータを作り、元データと比較していますが上手くいきません。 for($i=0; $i<@key; $i++){ print OUT "$key[$i]"; for($j=0; $j<@data; $j++){ if($key[$i] =~ /$data[$j]/){    #部分一致 print OUT "$'"; } } print OUT "\n"; } 部分一致の行を正規表現を用いて上手く処理したいのですがやり方がわからず躓いています。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • perl jcode::convert 半角>全角

    perlでjcode::convertで 半角を全角に変換すると 正しく変換される時とされない時があります。 例えば、 sample1.plとsample2.plの my $message = 'の次の「ハンカク」の4文字は半角の文字です。 (注)ここにアップロードすると全角で表示されてしまいます。   この4文字を半角にして確認してください。 sample1.plではこの4文字が全角に変換されるのですが sample2.plではこの4文字は半角のままです。 なぜ全角に変換されないのでしょうか。 (Windows7, ActivePerl v5.16.3) ---sample1.pl------------ require "jcode.pl"; my $message = 'ハンカク文字は使えるかな?'; jcode::convert(\$message,"sjis","", "z"); print "$message\n"; --------------- ---sample2.pl------------ require "jcode.pl"; my $message = 'ハンカク文字'; jcode::convert(\$message,"sjis","", "z"); print "$message\n"; --------------- なお、どちらも以下のようなメッセージが表示されています。 これは何を意味しているのでしょうか。 defined(%hash) is deprecated at C:/Perl64/site/lib/jcode.pl line 684. (Maybe you should just omit the defined()?) defined(%hash) is deprecated at C:/Perl64/site/lib/jcode.pl line 693. (Maybe you should just omit the defined()?)

    • ベストアンサー
    • Perl
  • 改行を含んだ文字列を正規表現で置換するには?

    正規表現で、改行を含んだ文字列を置換しようと思っています。 例えば下の「infile.txt」にある aaa bbb という(2行にわたる)文字列を zzz という文字列に変換させたい訳です。 試しに「test.vbs」のようなコードを書いてみましたが、これでは上手く行きませんでした。 上手く変換されるようにするには、どうしたら良いでしょうか? ----------------------------------------------------- ○「test.vbs」の内容 Set fso = CreateObject("Scripting.FileSystemObject") Set inFile = fso.OpenTextFile("C:\infile.txt") Set outFile = fso.CreateTextFile("C:\outfile.txt") Set regEx = New RegExp regEx.pattern = "aaa\nbbb" repStr = "zzz" Do Until inFile.AtEndOfStream tempLine = inFile.ReadLine repLine = regEx.Replace(tempLine, repStr) outFile.WriteLine repLine Loop inFile.Close outFile.Close ----------------------------------------------------- ○「C:\infile.txt」の内容 aaa bbb ccc