プログラムのヒントを下さい

このQ&Aのポイント
  • 初心者の方が統計ソフトRの処理において問題に直面しています。ファイルの特定の文字列を抽出するスクリプトを作成する必要がありますが、進めることができません。助けていただける方がいらっしゃいましたら、ご教授いただけないでしょうか。
  • C言語は学習済みですが、perlにはまだ慣れていない方がいます。統計ソフトRの処理のためのスクリプトを作成しようとしていますが、問題が発生しています。ファイルから特定の文字列を抽出し、繰り返しの形式で出力するスクリプトを作成する方法をご教示いただけませんか。
  • 初心者の方がperlのスクリプト作成について困っています。統計ソフトRの処理のためのスクリプトを作成する予定ですが、うまく進められません。ファイルから特定の文字列を抽出し、指定の形式で出力するスクリプトの作成方法をご教授いただけませんか。
回答を見る
  • ベストアンサー

プログラムのヒントを下さい

C言語は勉強しましたが、perlはまだまだ初心者の者です。 統計ソフトRの処理のためのスクリプトを書こうと思ってますが、うまくいかずに悩んでいます。 ファイルに以下の用に任意個の文字列が記述されています。ただし、ファイルの途中にはEND が複数かかれており、END以降も文字列が続きます。 apple best china dutch END apple beer END child death zero このファイルを受け取って、 c("apple","best,"chine","dutch"),c("apple","beer"),c("child","death", ,"zero") のようにENDが出てくるまでc(" ",...)を繰り返しを出力するスクリプトを書こうと思っています。 open(IN, "datafile.txt"); @xx = <IN>; print "c("; foreach $yy (@xx) { print "\"$yy\","; } print ")"; close(IN); のように書くとこまではいけたのですが、この先が進めません。どなたかご教授ください。

noname#182748
noname#182748
  • Perl
  • 回答数4
  • ありがとう数6

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

  • ベストアンサー
  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.4

> とそれぞれの()の最後の文字deuch beer zeroに,が残ってしまっています。これを消すにはどうしたらいいでしょうか? じゃあ、思いっきり手を抜くとこんな感じかな・・・。 open(IN, "datafile.txt"); @xx = <IN>; close(IN); my $yy = join("\",\"",@xx); $yy =~ s/\r\n|\r|\n//g; $yy =~ s/,\"END\",/),c(/g; print "c(\"".$yy."\")"; exit; でも本気でちゃんとプログラミングの処理として動作させたいなら自分がPCになったつもりで手順を考えたほうがためになると思う。

noname#182748
質問者

お礼

回答ありがとうございます。実際にスクリプトを試してみたのですが、 END apple beer apple END のようにend間に同一の単語が出現しているとエラーが起きてしまいました。 回答のプログラムはちょっとスキルが自分には高すぎて修正ができません。 なんども、お手数をかけてしまい、大変心苦しくおもうのですが、 end間に同一の単語がでた場合取り除くコードを教えてもらえませんか? なにとぞよろしくお願い申し上げます。

noname#182748
質問者

補足

質問が重複してしまったので改めて別のトピックとさせていただきます。回答ありがとうございました。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「C を勉強した」というなら, 「C ではどう書くか」を考えてそれを perl に変換してもいいような気はするが, それはさておき. そのプログラムがどのような動作をするのか, 説明できますか? そして, 何が足りないのか認識できていますか?

noname#182748
質問者

お礼

回答ありがとうございます。プログラム自体は、見れば何をやっているかはわかりますが、自分で思いつくのは難しいです。上手な人のコードをたくさんみて参考にしたいです。

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.2

たびたびすいません。 ヒントという質問だったのに全部書いて申し訳ありません。 先のリストには「END」が最終行にきた場合「...),c()」となってしまいますがそれでもいいのでしょうか? それとも、こういうの「,c()」は無し?

noname#182748
質問者

お礼

回答ありがとうございます。自分では思いつかなかったのでむしろ助かりました。 ENDが最後にくると、目視で削除します。 取り除けたらなおよいのですが。

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.1

これでどうですか? open(IN, "datafile.txt"); @xx = <IN>; close(IN); ##ファイルを開いている時間はできるだけ短く print "c("; foreach $yy (@xx) { $yy =~ s/\r\n|\r|\n//g; if($yy ne "END"){ print "\"$yy\","; }else{ print "),c("; } } print ")";

noname#182748
質問者

お礼

早い回答本当にありがとうございます。とても助かりました。 ほとんど完璧に近いのですが、 c("apple","best,"chine","dutch",),c("apple","beer",),c("child","death" ,"zero",) とそれぞれの()の最後の文字deuch beer zeroに,が残ってしまっています。これを消すにはどうしたらいいでしょうか?

関連するQ&A

  • なにがおかしいのでしょうか?

    先の質問「プログラムのヒントを下さい」でも扱ったのですが、 apple best apple END apple beer beer END zero child death zero のようなテキストから、ENDとENDの間か、ENDと最初もしくは最後の間の重複した文字列を取り除くスクリプトを書こうと思います。出力例は以下のようになってもらいたいです。 apple best END apple beer END zero child death 自分で頑張って下のコードまで書きましたが動きませんでした。特に、ENDと最初もしくは最後の間 の取り扱いがわかりません。どなたかご教授お願いいたします。 open(IN, "datafile"); @xx = <IN>; @zz = (); foreach $yy (@xx) { if ($yy eq "end"){ @uniq = uniqArray(\@zz); foreach my $value ( @uniq ){ print "$value\n"; } @zz = (); }else{ push(@zz,$yy); } } close(IN); sub uniqArray{ my $array = shift; my %hash = (); foreach my $value ( @$array ){ $hash{$value} = 1; } return( keys %hash ); }

    • ベストアンサー
    • Perl
  • リファレンスについて。

    以下のperlスクリプトで、どちらも私には同じ結果をもたらすものだと 予想していたのですが、出力結果が異なってしまいます。 なぜ script1 ではエラーなしで動作するのに、script 2では エラーが出るのでしょうか。 $$xx が d になり、 $$yy が ARRAY(0x180c460) となる理由も わかりません。 稚拙な質問で申し訳ありませんが、どなたかよろしくお願いしますm(_ _)m ## script 1 とします。 my $xx = \qw(a b c d); print "$$xx \n"; # d と出力される print "xx is $$xx \n"; # xx is d と出力。 ## script 2 とします。 my @array = qw(a b c d); my $yy = \@array; print "$yy \n"; # ARRAY(0x180c460) と出力される。 print "yy is $$yy \n"; # Not a SCALAR reference at tryme.pl line 11. とエラーになる。

    • ベストアンサー
    • Perl
  • UNIXコマンドのjoinについて

    -------------- -------------- 1 XX XXX 1 xx xxx 2 YY YYY 2 yy yyy 3 ZZ ZZZ  3 zz zzz ~      ~ -------------- -------------- UNIXコマンドのjoinを用いて上の二つのファイルを結合させ、 ---------------------- 1 XX XXX xx xxx 2 YY YYY yy yyy 3 ZZ ZZZ zz zzz ~ ---------------------- としたかったのですが、一列目の数字が急に変化するとそれ以降の行が出力されなくなります。(例えば、100の次が1000になった時など) どのようしたらこのような事が防げるのでしょうか? もしjoinでは防げないなら、joinのように2つのファイルの1列目の数字が同じだった時に結合して出力してくれるプログラムを書ける方がいたら教えていただきたいです。 perlかC++だと助かります。よろしくお願いします。

  • このような場合のSQLの記述

    下記のSQLの記述方法について教えてください。 TBL:smp A  B  C ------------ XX あ 5 YY え 3 ZZ お 2 XX え 1 のテーブルで、Aの列でグループ化し、Cの列の最大の行を出力したい。 アウトプットとしては、 A  B  C ------------ XX あ 5 YY え 3 ZZ お 2 にしたいのですが、A、Bでグループ化すると、上記のアウトプットにはならず、 Aだけでグループ化すると、Bの列が表示されない。 どうしたらいいでしょうか?

  • このプログラムなんですが

    #! /usr/bin/perl @data=<>; open (IN,"newtype.txt"); @file = <IN>; close (IN); foreach $address (@file) { ($pn,$ad) = split(/\t/,$address); $pnad{$pn}=$ad; } foreach $jusyo (@data) { chomp $jusyo; print $jusyo; print "\n"; print "$pnad{$jusyo}"; } foreach $line (@file) { @data = split(/t\/, $line); if($data[0] =~ "51105") { print "$data[0]"; print "$data[1]"; } elsif($data[0] =~ "651130") { print "$data[0]"; print "$data[1]"; } } exit; コンパイルするときには ./sample.pl data.txt をシェルにうって実行します。 このプログラムでは、はじめに自分で指定したファイル内に存在する郵便番号(通常は7桁だけなんですが、プログラムを見ていただければわかると思われますが、それ以外に5桁(たとえば12354XX,x12354x,xx12354など))と6桁(134567x,x134567など)がありまして、それを表示させたいんですが、上のプログラムでは、if文以下の5桁と6桁があった場合にそれを同時に表示させるプログラムができていないんです。 ハッシュをもちいてプログラムを作り直したいんですが、教えてください。 今日の夜8時までに出さなくてはいけないので、すぐに回答をいただけたらありがたいです。

  • 条件部分の行だけ取り出す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に出力するのはできました。 部分だけ取り出そうとすると失敗しました。 どこを直せばいいのでしょうか?

    • ベストアンサー
    • Perl
  • VBA 文字列で検索し結果をカウントする

    すいません VBAど初心者、猛勉強中の者です。 前回と同じようなご質問になりますが、応用が加わると途端に手が止まってしまいました。 どなたか教えて頂けませんでしょうか。 ※子供と大人に好きな果物、さらに好きな季節を調査をした結果です。    A列  B列    C列 1行:子供  りんご   1.春 2行:大人  バナナ   2.夏 3行:大人  バナナ   夏物 4行:子供  りんご   秋 5行:大人  りんご   3.秋 6行:子供  りんご   4.冬 7行:大人  バナナ   春    8行:子供  りんご   4.冬 9行:大人  りんご   2.夏 ・・・以下1000行まで続く というデータがあるとして、A列が「子供」かつB列が「りんご」と回答した人数は 出来たのです、以下の人数を出すことができません。 ■教えて頂きたい内容 A列が「子供」かつB列が「りんご」、かつC列が"春"または"夏"の文字列を含む人数 以下のソースですと人数が「0人」となり正確にカウント出来ません。 前回と同じような内容で恐縮ですが、応用が加わると途端に手詰まりになってしまいます。 度々の質問で申し訳ございませんがどうぞよろしくお願い致します。 --------------------------- Sub CounterMacro() Dim Counter As Integer Dim EndCount As Integer Dim Child_Apple As Integer Dim Child_AppleSeason As Integer Counter = 1 EndCount = Worksheets("Sheet1").Range("A1").End(xlDown).Row + 1 Child_Apple = 0 Child_AppleSeason = 0 Do While Counter < EndCount If Worksheets("Sheet1").Range("A" & Counter).Value = "子供" Then If Worksheets("Sheet1").Range("B" & Counter).Value = "りんご" Then Child_Apple = Child_Apple + 1 End If If Worksheets("Sheet1").Range("C" & Counter).Value = "*春* or *夏*" Then Child_AppleSeason = Child_AppleSeason + 1 '■←教えて頂きたい内容 End If End If Counter = Counter + 1 Loop MsgBox "「子供」かつ「りんご」" & Child_Apple & "人 " & "「子供」かつ「りんご」かつ「春まはた夏」" & Child_AppleSeason & "人 " End Sub

  • Linuxについて

    Linuxの授業で、 『ディレクトリ20XX内のファイルとディレクトリ20YY内のファイルとの組み合わせのうち、 2行目以降の内容が同一の組み合わせを求めるシェルスクリプトを作成しなさい』 という問題が出ました。 この問題の中で、『各ファイル2行目以降のMD5値とファイル名の組をtmp/20XX_tmp.txtにまとめる』 という作業がありますが、やり方が分かりません。 2行目以降のMD5値をまとめるだけなら、 foreach i (20XX/*.txt) tail -n +2 $i | md5sum >> tmp/20XX_tmp.txt end と入力すればいいのですが....。 また、http://okwave.jp/qa/q5948919.htmlに載っているやり方でやってみても、できませんでした。 分かる人がいたら、是非教えてください。

  • 全ファイル名をセルに出力するVBAプログラム

    VBA初心者です。 Aというディレクトリがあり、その中に1,2,3,4というフォルダがあります。 1には「apple1.csv」、「orange1.csv」、「banana1.csv」 2には「apple2.csv」、「orange2.csv」、「banana1.csv」 ・・・ 4には「apple4.csv」、「orange4.csv」、「banana4.csv」 が入っています。 この1から4のフォルダのapple1,apple2,apple3,apple4のファイルをとりだし、それぞれのA1~A10セルを新たなファイルに自動転記する(apple1はA1~A10,apple2はB10~B10・・・)といった具合のマクロを組みたいと思っています。 そこで以下のHPを参考にし、まずはトップディレクトリである「C:\Sample」の中のすべてのフォルダを表示するプログラムをつくってみようと試みました。 ホームページでは以下のソース Sub Sample() Call FileSearch("C:\Sample") End Sub Sub FileSearch(Path As String) Dim FSO As Object, Folder As Variant Set FSO = CreateObject("Scripting.FileSystemObject") For Each Folder In FSO.GetFolder(Path).SubFolders Debug.Print Folder.Path Call FileSearch(Folder.Path) ''見つかったフォルダを引数に指定して、自分自身を呼び出す Next Folder End Sub によってイミディエイトにフォルダを表示する仕様になっています。 実際、私もこのソースで実行したところ、イミディエイトにはトップディレクトリ以下の全ディレクトリ名が表示されました。 これを改良し、2列目に全ディレクトリ名が表示されるプログラムを組みました。ソースは以下です。 Sub Sample() Call FileSearch("C:\Sample") End Sub Sub FileSearch(Path As String) Dim FSO As Object, Folder As Variant ' Dim i As Integer ' i = 1 Set FSO = CreateObject("Scripting.FileSystemObject") For i = 1 To FSO.GetFolder(Path).SubFolders Debug.Print Folder.Path Call FileSearch(Folder.Path) ''見つかったフォルダを引数に指定して、自分自身を呼び出す i = i + 1 Cells(i, 2) = Folder Next i End Sub これを実行したところ、2列目にはすべてのディレクトリは表示されず、一部のディレクトリしか表示されません。 改良の仕方がおそらくまずいと思うのですが、何か私が根本的に間違えている気がするので、ご指摘いただけたら幸いです。

  • エラーになってしまいます。

    先日、ファイルの一行だけを読込める?と質問した者です。早速教えて頂いた方法でやってみました。 open(IN,"A.txt"); while ($xx = <IN>) {   if ($. == 5) {     print $xx;   } } close(IN); とやりました。 サーバーエラーになるのでまず open(IN, "A.txt"); while ($xx = <IN>) { print $xx; } close(IN); とファイルの読み込みでやってみたのですがそれでもサーバーエラーになってしまいました。 エラーの原因がどこにあるのか、わからなく困っています。考えられるような原因は何でしょうか? ちなみにcgiのパーミッションは755です。 あとtxtファイルをどこに置けばいいのか、よくわからないいのですがそれが原因なのでしょうか?

    • ベストアンサー
    • CGI