- ベストアンサー
こういうソフトを探しています
フォルダにあるファイル(5つ程度で それぞれ内容の異なるファイル)を開けることなく、 その中の内容の指定された行数だけ別ファイルに書き 出すようなソフトを知らないでしょうか? 一度Cで作ろうとしたのですが、 締め切りが迫って来た為、 今回はフリーソフトでと思って探しています。 どうかよろしくお願いします。
- みんなの回答 (12)
- 専門家の回答
質問者が選んだベストアンサー
下のソースをメモ帳にでもコピーして好きな名前で保存して使ってください。Cが分かるようなのでC likeに書いてみました(perl likeに書くともうちょっと省略できるんだけど)。インデント(字下げ)がおかしいようなら、適当にインデントしてください(Cのインデントと同じです)。 ------------------------------------------------ ($start, $end, @files) = @ARGV; foreach $file (@files){ $count = 0; open(IN, $file) || die "$file: ", $!; printf("### %s\n", $file); while($line = <IN>){ $count++; if($start <= $count) {printf("%s", $line);} if($count >= $end) {last;} } close(IN); printf("\n"); } ----------------------------------------------- perl for winのインストール/設定は、自分でやってね(winマシンがないからアドバイスできなし)。 使い方は、#7の最終行そのものです。入力ファイル指定には、複数ファイルを指定できます(もちろんワイルドカードで指定もできます)。 プログラムでは、入力ファイル名も出力するようになっていますが、不要だったら、6行目のprintfをコメントアウトしてください。また、それぞれのファイルの処理結果の間にスペースが入るようになっていますが、それも不要でしたら、13行目のprintfもコメントアウトしてください。※perlのコメントアウトは行頭に#をつければ良いです。 分からなかったら、また聞いてください。もう寝ますので、回答は明日以降になると思いますが。
その他の回答 (11)
- damejan
- ベストアンサー率30% (58/192)
>日付と時間を指定するだけでその名前を新規に >作成するフォルダ名に反映させたいのですが No.10さんが教えてくれたGNUコマンドのWin32移植版を使えば、簡単です(No.10さんにもお礼しましょう)。 GNUコマンドのsh.exeを使います。 name=`date +'%Y%m%e_%H%M%S'` mkdir $name とメモ帳などで書いて、例えば、date_folder.shなどと名前をつけて保存します(この例では、フォルダ名に秒まで入ります)。 コマンドプロンプトから、 sh.exe date_folder.sh を実行するとお望みのことができます。実際にWinでやったわけじゃありません。Linux上ではできます。もっとも、Unix系では、次のような感じでコマンドから直接打ってもできます。 mkdir `date +'%Y%m%e_%H%M%S'` もちろん、perlでプログラム組んでもできますが、そんなことするほどのもんじゃないし。
- damejan
- ベストアンサー率30% (58/192)
> GNUコマンドのWin32移植版を使うといいと思います。 これいいね。CygwinかマイクロソフトのServices for UNIXしか知りませんでした。これは、Cygwinみたいに皮をかぶせる必要がなく、Winネイティブだから楽ちんね。sedもあるし、toubousyaさんのやりたいこともすぐですね。
- Silent-G
- ベストアンサー率15% (2/13)
おはようございます。 GNUコマンドのWin32移植版を使うといいと思います。 プログラムを組まなくていいしインストールも簡単で 後々応用が利くのでオススメですよ。 参考URLから"UnxUtils.zip"をダウンロードして適当なところに解凍し、 "usr\local\wbin"にPathを通します。 たとえば、"C:\UnxUtils"に解凍した場合、"C:\UnxUtils\usr\local\wbin"に Pathを通します。 そして、コマンドプロンプトから C:\>C:\UnxUtils\usr\local\wbin\find . -maxdepth 1 -name *.txt -exec head -n5 {} ; とすれば"c:\"の"*.txt"ファイルの先頭5行を出力してくれます。 "."の部分を実行したいフォルダー名にするか、実行Pathを移動すれば 任意の場所のファイルで実行できます。 あとは、ファイルにリダイレクトするだけです。 (コマンドの詳細はgoogleなどで調べてみてくださいね) 注意1:上記コマンドで"C:\UnxUtils\usr\local\wbin\find"としているのはDOSのFINDコマンドを使用しないためです。 注意2:上記コマンドの最後の部分ですが、"}"と";"の間に空白を必ず入れてください。 では。
お礼
有難うございました。 Unixは前から興味を持っていて いつかは使ってみたいと思っていたので、 勉強も兼ねて使ってみたいと思います。 いろいろと有難うございました。
- damejan
- ベストアンサー率30% (58/192)
別に間違っちゃいないんだけど、プログラムの10行目 if($count >= $end) {last;} じゃなくて if($count == $end) {last;} でよかった。
- damejan
- ベストアンサー率30% (58/192)
>それと、sedって2000とかXPでもOKなの? NTがいけるから、大丈夫じゃない。手元にWinマシンがないから分かんないけど。 toubousyaさんのやりたいことの確認です。 (1)複数のファイルに対して、出力ファイルは1つだけですか? file1.txt, file2.txt, file3.txt, ... の結果が、それぞれ、out1.txt, out2.txt, out3.txt, ... に出力されるという感じ? それとも (2)それぞれのファイルに対して、1つずつ出力ファイルが必要ですか? file1.txt, file2.txt, file3.txt, ... の結果が全てoutall.txtに出力されるという感じ? 一応、perlスクリプトはもうできていて、こんな感じで使えます。file1.txtの3行目から5行目までを表示する場合、 perl GetLines.pl 3 5 file1.txt この出力をout1.txtに書き込む場合 perl GetLines.pl 3 5 file1.txt > out1.txt
補足
(1)複数ファイルに対して、出力ファイルは1つだけです。 お願いします。
- damejan
- ベストアンサー率30% (58/192)
perlでもsedでもどれでもいいから、toubousya決めて。 perlだったら、ここにプログラム書くし(どうせ10行くらいだから)。
補足
ddamejanさん、 今後の勉強のためにもPerlのプログラム お願いします。 それと、sedって2000とかXPでもOKなの?
- damejan
- ベストアンサー率30% (58/192)
分かった。Services for UNIXとかPerlじゃなくて、sedにしよう。sedなら物凄く簡単。toubousyaさんがやりたいことに対してプログラムの必要なし。 例えば、file1.txtの5行目から13行目まで出力したいときには、 sed -n 5,13p file1.txt とコマンドプロンプトから打ち込むだけでいいから。 sedにしよう、やっぱり。
- damejan
- ベストアンサー率30% (58/192)
perlだったら、下記URLからダウンロードしてね。
- damejan
- ベストアンサー率30% (58/192)
#2に書いたような大げさなことをするのが、嫌なら、perlをインストールして、perlでプログラムを組むってのもいいですね。Cよりも遥かに簡単に書けますよ。まあ、新たにperlを勉強する時間が必要ですが。ほしい機能を詳しく書いてくれれば、ここでプログラム例を書いてもいいですよ。
補足
プログラム書いてほしいです。 Perlも少し考えたのですが、 実力がなくて・・・。 ほしい機能って質問の通りなんですが、 それだけでは無理でしょうか?
- damejan
- ベストアンサー率30% (58/192)
Unix系のコマンドなら簡単にできます。 例えば、file1.txtの先頭20行を表示するならば、 head -20 file1.txt と打ち込めばOKです。outfile.txtに出力するならば、 head -20 file1.txt > outfile.txt です。 残念ながら、こういったUnix系のコマンドラインツールはwindowsにはありません。 では、これをwindows上でやるには、下記のURLからservices for UNIXの評価版をダウンロードして、インストールしてください。コマンドの使い方はその後でということで。インストールするときに、色んなサーバのインストールをどうするか設定するかと思いますが、今回は全くサーバ関連は入れなくていいです。
- 1
- 2
補足
本当に有難うございました。 いろいろ使ってみて自分に良かったのを 使わせていただきたいと思います。 damejanさん、新たに質問していですか? 日付と時間を指定するだけでその名前を 新規に作成するフォルダ名に反映させたいのですが そんなことは出来るでしょうか? 例えば、2003年5月21日、13時30分というのであれば、 フォルダ名に 20030521_1330 というような フォルダ名にしたいのですが…。