• ベストアンサー

ファイルの読み込み時に場所を指定する

#ファイルの読み込み $pathname="C://Perl/datafile/anovaCR.dat"; open MYFILE, "$pathname"; while (<MYFILE>) { chomp; @{"dat$."} = split /\t/; } $rows=$.; close MYFILE; といったように,コード中に既にデータが入力されたファイルを指定しているのですが,プログラムを実行した時に(Windowsなので)コマンドプロントの画面に 「ファイルの場所を指定してください。」 などと表示し,コマンドプロント上で C://Perl/datafile/anovaCR.dat と指定して読み込ませることは可能でしょうか。もちろん,可能は可能でしょうが「初心者には荷が重過ぎて無理」ではないかということです。手持ちの書籍には載っていませんし,webをどのように検索すればよいかもよく分かりません。

  • backs
  • お礼率85% (564/660)
  • Perl
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • maura
  • ベストアンサー率46% (48/104)
回答No.1

print "ファイルの場所を指定してください。: "; $input = <STDIN>; print $input;

backs
質問者

お礼

回答ありがとうございました。 なるほど,難しく考えずに STDIN を使って上げればよかったのですね。

その他の回答 (1)

回答No.2

補足要求です Windowsのダイヤログウィンドウで表示させたいのでしょうか? コマンドラインで実行する場合は#1さんの方法でよいかと思いますが、 Windowsのダイヤログを想定したときは残念ながら適用できません。 お手数ですが、回答お願いします。

backs
質問者

お礼

回答ありがとうございました。 少し言葉足らずですみませんでした。コマンドラインで実行できればよかったのでNo.1さんの提示してくださった方法で大丈夫でした。

関連するQ&A

  • textareaに入力されたデータを読み込む

    例えば以下のようにtextarea内にデータが入力されているとします(カンマ区切り,スペース区切り,タブ区切りなどはなんでも良いのですが)。 +---ここから---+ 1 2 3 4 5 6 7 8 9 10 11 12 +---ここまで---+ これらのデータを配列に格納する方法が,だいぶネットサーフィンしていたのですが分かりません。 以降,Perlになってしまうのですが,1行ずつ配列にdat=(1,2,3,4)のように格納していくか,あるいは行列(2次配列)の形で格納したいのです。 $pathname="D://datafile.dat"; open MYFILE, "$pathname"; while (<MYFILE>) { chomp; @{"dat$."} = split /,/; } close MYFILE; +----------- $pathname="D://datafile.dat"; open MYFILE, "$pathname"; @dat = map {chomp;[split /,/]} <MYFILE>; close MYFILE;

  • 読み込んだデータを配列へ代入する方法

    ---ここから--- 1,2 3,4 ---ここまで--- このようなファイルを読み込んでデータを配列へ格納するには, $pathname="D://data.txt"; open MYFILE, "$pathname"; @list=<MYFILE>; for($i=0;$i<2;$i++){ @dat=split(/,/,$list[$i]); print @dat; } close MYFILE; といったようなforあるいはwhileで1つの配列(上の場合だと@dat)に1行のデータを繰り返し入れていく方法しか思い浮かびません。できれば1行目のデータは@dat1という配列へ,2行目のデータは@dat2という配列へ,といったように行ごとに別々の配列へ代入させたいのですが良い方法はないでしょうか。 もしくは@dat=([1,2],[3,4])のような2次配列の形にでもできれば最高なのですが、、、

    • ベストアンサー
    • Perl
  • csvファイルを統合する

    あるディレクトリにtest1.txtとtest2.txtというカンマ区切り(拡張子はcsvではないですけど)があったとして、それらのファイルを1行ずつ読み込み、それを追加書き出しで1つのファイルに収めていこうとしています。 そこで以下のようなコードを書いてみたのですが、どうやらtest1.txtしか読み込んで書き出せていないようなのです。その原因が分からずに困っています。 $dir = 'C:/Perl/workdir'; # 対象ディレクトリ名 open MYHANDLE, ">>out.txt"; # 追加書き出しモードでファイルハンドルをオープン opendir DH, $dir or die "$dir:$!"; # ディレクトリを開く while ($file = readdir DH) { # ディレクトリにあるファイル名を取得し、$fileに格納 next if $file =~ /^\.{1,2}$/; # '.'や'..'も取れるので、スキップする open MYFILE, "$file"; # 取得したファイルを開く while (<MYFILE>) { chomp; @dat = split /,/; # 読み込むファイルは「カンマ区切り」としてレコードを読み込む。 $n = @dat; for($i=0; $i<$n; $i++){ print MYHANDLE $dat[$i]; # ファイルに追加書き出し(ファイルがなければ新規作成される) print MYHANDLE ","; # カンマ区切りで書き出していく } print MYHANDLE "\n"; # 1行読み終えるごとに改行 } close MYFILE; # i番目のファイルを読み終えたら閉じる print $file, "\n"; # 読み込み・書き出しをしたファイル名を表示する } closedir DH; close MYHANDLE;

    • ベストアンサー
    • Perl
  • コマンドプロントでファイルの削除方法

    コマンドプロント初心者です。 やりたいことは、バッチ処理にて、指定したフォルダ内の「*.dat」ファイルを削除することです。 ネットで調べてみたんですが、削除されません。 また、削除してよいかの確認メッセージも表示されません。 何が悪いのかご教授お願いします。 以下が作成したバッチファイルの中身です。 -- ********************************** -- Outlook 2010 添付ファイルのキャッシュを削除する -- ********************************** C:\Temp>del *.dat C:\Temp\*.dat、よろしいですか (Y/N)?

  • 掲示板の文字色指定について

    はじめまして。私は学生で超のつく初心者なのですが、課題で掲示板を作っています。 基本的な表示はなんとかうまくいったのですが、よくある、文字色を選択して好きな色で文章(コメント)を表示させるプログラムがわかりません。 if文を使うパターンではなく、色の情報を書き込み、ファイルからデータを読み込むやり方でできるらしいのですが、どうやって書いたらよいのでしょうか・・・。 ちなみにhtml表示部分に、色の指定はしてあり、赤、青、緑、黄色でvalueはred,blue,green,yellowにしています。 下に書き込みと読み込みの部分を乗せたのですがどう入れたらいいでしょうか。 本当に初心者だし分かっていないので説明もわかりにくくてすいません。もしどなたか分かる方いたらよろしくお願いします。 #------------------------------------------------------------ # 登録データ書き込み処理 #------------------------------------------------------------ sub writeData() { # $DATAFILEをオープンする open(FILE, ">> $DATAFILE") or die("error:$DATAFILE open error!"); eval{ flock(FILE, 2); }; $timestr = &getTimestr(); $in{'comment'} =~ s/\n/<br>/g; print FILE "$in{'namae'},$in{'dai'},$in{'comment'},$timestr,"; close(FILE); } #------------------------------------------------------------ # 登録データ読込み処理 #------------------------------------------------------------ sub readData() { # $DATAFILEをオープンする open(FILE, "< $DATAFILE"); eval{ flock(FILE, 2); }; while(<FILE>){ chomp; $line[$cnt++] = $_; } close(FILE); }

    • ベストアンサー
    • CGI
  • 連想配列で時間短縮したい

    aaa.txt 06011800, 5.3 06012100, 5 06020000, 4.5 06020300, 6.2 … bbb.txt 06011800, 5.1 06012100, 7.5 06020000, 5.1 06020300, 9.3 … という二つのファイルがあります。 以下のプログラムを用いて、 06011800, 5.3, 5.1 06012100, 5, 7.5 06020000, 4.5, 5.1 06020300, 6.2, 9.3 … といった感じでデータを作る事に成功したのですが、どうしてもループに無駄が多く、時間がかかってしまいます。 連想配列などを使えば時間が短縮出来そうなのですが、よくわかりません。 ご教示いただけないでしょうか。 以下、作成したプログラム。 $csvfile1 = $ARGV[0]; $csvfile2 = $ARGV[1]; open(DAT1, $csvfile1) || die $!; while($line=<DAT1>) { chomp($line); @dat = split(/,/,$line); open(DAT2, $csvfile2) || die $!; while($line2=<DAT2>) { chomp($line2); @dat2 = split(/,/,$line2); if($dat[0] == $dat2[0]){ print "$dat[0],$dat[1],$dat2[1]\n"; } } } close(DAT);

    • ベストアンサー
    • Perl
  • Perlのファイルオープン時のモードについて。

    初歩の初歩、テキストカウンターを作成しようとして open (CNT,"+<cnt.dat"); $cnt = <CNT>; close(CNT); chomp $cnt; $cnt = $cnt + 1; print CNT $cnt; close (CNT); と上記のようなプログラムを書いたのですが、 ファイルに書き込みがなされません。 多少わかりにくい書き方になるかとは思いましたが、 open (CNT,"<cnt.dat"); $cnt = <CNT>; close(CNT); open(CNT,">$cntfile"); chomp $cnt; $cnt = $cnt + 1; print CNT $cnt; close (CNT); という風に書きかえてみました。 こちらですと、書き込みはされるのですが何故かカウントが 2つずつカウントされてしまうんです。 プログラムとしておかしな点というのが思い当たらずお手上げです。 ご教授下さい、お願いします。

    • ベストアンサー
    • Perl
  • 区切りファイルの列ソートについて

    僭越ながら、質問させていただきます。 タブ記号で区切られたTSVファイルというものを扱っているのですが、まずtest.tsvファイルを配列に格納して、そこから2列目の値すべてを降順にソートし、 (列をソートした結果の行は、ちゃんと最初のまま保持され、バラけずに出力されるようにしたい) その結果をresult.txtに表示させるプログラムを作りたいと思っております。 ですが、自分が書いたプログラムではまったく動かず、どこが悪いのかも情けないことにわかりません…。  かれこれ何時間も悩んでいますが、まったく方策が見出せません。どこをどう直せばいいのか、ヒントだけでも構いませんので、教えてくださいませんでしょうか。 プログラムは以下です。 #!/usr/bin/perl use strict; use warnings; use Fatal qw/ open /; my @values; my $tsv_file = "test.tsv"; my @tsv = &readtsvfile($tsv_file); @values = sort { $a->[1] cmp $b->[1] } @tsv; open(DATAFILE, '>>result.txt') or die("error :$!"); foreach(@tsv){ print DATAFILE; } sub readtsvfile { open(IN, $_[0]); while(<IN>) { chomp; push @tsv, [ split(/\t/) ]; } close(IN); return @tsv; } close DATAFILE; このプログラムの手直しでも新しい方法でもなんでも構いません、何か教えてくだされば、本当にありがたいです。よろしくお願いします。

    • ベストアンサー
    • Perl
  • ファイルの読み込み処理が上手くいきません。

    aaaフォルダ配下のファイルfruits.csv(タブ区切り2列)の1列目の内容が@dbline[1]の内容と等しいものについて、2列目の内容を$Hinmeiに取り出すプログラムを以下のように作成しましたが、他の変数の領域を壊しているようです。何が問題なのかご教示下さい。 因みにif文を何個も使用して条件に合うものの品名を取り出すことはできますが、if文が増えてしまい、見栄えが良くありません。 open (FILE,"../aaa/fruits.csv”); while (<FILE>){ chomp $_; @data=split(/\t/,$_); if(@dbline[1] eq @data[0]) { $Hinmei=$data[1]; last; } } close(FILE);

    • ベストアンサー
    • Perl
  • VBA フォルダ内のファイルを昇順に読み出す方法

    以下のような簡単なプログラムを組みました。 ファイル名を昇順に読み出せると思っていましたが、そうならない場合があるようです。 なぜなのでしょうか? また、どうすればファイルを昇順に読み出せるのでしょうか? どなたか教えて頂けないでしょうか? (抜粋) Set WS1 = Worksheets("データー(org)") '書き出すシート Set WS3 = Worksheets("集計") Dim a As String With Application.FileDialog(msoFileDialogFolderPicker) .Show PathName = .SelectedItems(1) & "\" 'ファイルの入っているフォルダを指定 End With BookName = Dir(PathName) '処理するファイル Do Until BookName = "" Workbooks.Open PathName & BookName 'ファイルを開く Set WS2 = Worksheets(1) '読み込むシート WS2.Rows("1:" & WS2.UsedRange.Rows.Count).Copy If WS1.UsedRange.Rows.Count = 1 Then WS1.Rows(WS1.UsedRange.Rows.Count).PasteSpecial Paste:=xlValues Else WS1.Rows(WS1.UsedRange.Rows.Count + 1).PasteSpecial Paste:=xlValues End If Workbooks(BookName).Close 'ファイルを閉じる BookName = Dir() 'ファイル名をクリア Loop

専門家に質問してみよう