• ベストアンサー

指定行データの取得

perlにてテキストファイルのある指定行のデータを取得するのは どのようにするのでしょうか? 行の選択は 「5行目(または5)」のように指定したいと思います。

noname#29127
noname#29127
  • Perl
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • ttyp03
  • ベストアンサー率28% (277/960)
回答No.3

#1です。 >なにか処理時間を短縮できる、うまいやりかたなどないのでしょうか? まず各行が固定長であるならば seek 関数を使ってファイルポインタを一気に移動させることができます。 例えば一行100バイトと決まっているなら、100バイト×(5-1) の位置へ移動させれば次に読み込むのは5行目ということになります。 (5-1)の意味はファイルポインタの先頭は0なので400バイト目が5行目になります。 各行が固定長でない場合、各行の位置を記録した別のファイルを作ることで高速化させることもできます。 例えば1行目は0、2行目は50、5行目は150、などど記録しておいて、5行目が必要なら150を取り出して先程の seek 関数で移動させる。 ま、これをやるにはその別のファイルの管理も必要になりますが。 ファイル読み込みの高速化は突き詰めればデータベースになってしまいますね。 またperlで扱う程度のファイルサイズ(例えば1000行や10000行程度)なら気にするほど速度は遅くないと思います。 多分コンマ1秒もかからないですよ。 何百万行もある最後のほうの行を取得となると話は別ですが。

その他の回答 (2)

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

$. が読み込んだ行数を覚えているので, 5行目を表示するなら open(IN, "<hoge"); while (<IN>) { print if $. == 5; } でいいんですが, 1000行目を表示するときに 1000行読み込んじゃうのはしょうがないですね. 1000行目ということは「999個目の \n から 1000個目の \n の間」を意味するわけですが, 読み込んだ \n が何個目かを知るには本質的に先頭から読んでいくしかないわけで.

  • ttyp03
  • ベストアンサー率28% (277/960)
回答No.1

基本的には1行読むという処理を5回やればいいわけです。 $pos = 5; open( IN, "test.txt" ); $line = ""; for( $i = 1; !eof( IN ); $i++ ){ $work = <IN>; if( $i == $pos ){ $line = $work; break; } } close( IN ); print $line; もしくは一括でファイル内容を取り込み、配列から取得することもできます。 ただこの方法ですと、対象となるファイルが巨大だとその分メモリを食うことになるので注意が必要です。 $pos = 5; open( IN, "test.txt" ); @file = <IN>; close( IN ); print $file[$pos - 1];

noname#29127
質問者

お礼

回答ありがとうございます。 この方法ですと1000行目を読む場合は1000行分をよまないと いけないのですね。 なにか処理時間を短縮できる、うまいやりかたなどない のでしょうか?

関連するQ&A

  • DOSプロンプト:テキストから指定した行番号の行のみを取得したい

    DOSプロンプトを使用しテキストから指定した行番号のみを取得したいです。for文でテキストを全行読みながら取得などせず、効率的にその行だけを取得したいです。

  • 【C#】textBoxの指定行のデータを削除

    凄く基本的なことかもしれないのですが色々検索しても見つからなかったので質問させてください。 Visual C# 2010を使っています。 textBoxのMultiLineをtrueにして複数行書けるようにしています。 そこで、プログラム上で指定の行を削除したり書き換えたりする方法を知りたいです。 指定の行のデータを取得する方法はわかったのですが、応用できませんでした。 MessageBox.Show(textBox1.Lines[0].ToString()); で、1行目のデータをMessageBoxで表示できました。 なので、以下のように書けば削除できるかと思いましたがダメでした。 textBox1.Lines[0] = ""; もしくは textBox1.Lines[0].Remove(0); 目的は、以下のような複数行のデータがあった場合に指定の行を消すといったことです。 1234 5678 9012 で、例えば、2行目を消して 1234 9012 としたいです。 textBox1.Text = textBox1.Text.Replace(textBox1.Lines[0], ""); とやって置き換えることはできるのですが、同じデータがある場合に全て置き換わってしまうのと、改行が残ってしまうので微妙です。 よろしくお願いします。

  • SELECTでの指定行からの指定行数文の取得

    こんにちは。 OracleでSELECT文、一発で指定行から指定行数分のデータを取得するように指定できるのでしょうか? 例) SELECT * from tbl01; で、100行取得できる状態で25行目から30行分取得する OracleのSQLリファレンスを調べたのですが該当するようなものは 見当たりませんでした。 よろしくお願いします。

  • PHP5でCSVの指定行データだけを取得するには?

    PHP初心者です。 下記のような方法で全てのデータを取得する方法があると知りました。 $fp = fopen("url.csv", "r"); while ($data = fgetcsv($fp, 1)) { foreach ($data as $d) { print $d . "<br>\n"; } } しかし指定行、例えば10行目等だけを取得する方法がわかりません。 CSVは1列で1000行ほどあります。 恐れ入りますが具体的なソースを教えてくださいませ。

    • ベストアンサー
    • PHP
  • 指定行の内容を取得するにはどうしたら良いでしょうか

    PHPで外部テキストの指定行を読み込むにはどうしたら良いのでしょうか?

    • ベストアンサー
    • PHP
  • Windows batで指定した行のみ値を取得

    Windows batで指定した行のみ値を取得したいのですが、うまく取得できません。 <CSVデータの内容> 0002 10,11,19,12,15,1192 ,0,00 10,11,20,17,30,1192 ,1,00 <実行bat> REM データ取得 FOR /F "tokens=7-9 delims=," %%i in (dakoku_data.csv) DO SET C=%%i%%j これを実行すると、 C = 000 C = 100 となってしまい、最終行の値だけが格納されてしまうので、 指定した行の値だけ、取得するには、どうしたらよいでしょうか?

  • 指定した行から指定した行数文データを取得したい

    WEB上で、1ページ10行のデータを表示したいので、 10行ずつデータを取得できるSQLを書きたいと思うのですが、方法が分かりません。 参考書に 41行目から50行目を取得する方法として SELECT TOP 10 A,B FROM MyTable WHERE keyID Not IN (SELECT TOP 40 keyID FROM myTable) とかかれていました。 この場合、データが keyID,A,B 1,A1,B1 2,A2,B2 ・ ・ ・ 40,A*,B* 41,A*,B* ・ ・ とkeyIDが重複しない時ですよね。 主キーが複数あるときはどのようなSQL文にすればいいのでしょうか?

  • CSVファイルの行と列のセルってどうやって指定するのですか?

    たとえば、1行目の2列目のセルの値を消したい。 2行目の5列目のセルの値に数字の5をいれたい。 って場合、行だったら $FILE=data.csv; open(IN, $FILE); @data=<IN>; close(IN); このときの $data[2]は3行目ですよね? では3行目の3列目はどうやって指定するのでしょうか?たとえば3行目の3列目のセルの数字の5だったのをperlを実行したらセルの中を6に書き換えるのはどうしたらいいのでしょうか?

    • ベストアンサー
    • Perl
  • ListViewで表示されたデータの選択行指定

    ListViewで複数行データが表示されている場合に指定の行を選択状態にする事は可能なのでしょうか?いろいろ調べているのですが分かりません。ご存知の方いらっしゃいましたらよろしくお願いします。

  • 50万行のtxtファイルを行数指定で分割したい

    50万行レベルのテキストファイルがあります このファイルをVBAで行数を指定して3つのファイルに分割したいのですが可能でしょうか イメージとしては以下のような形になります ・一行目〜テキストボックス1で指定した行数 ・textbox1で指定した行数〜textbox2で指定した行数 ・textbox2で指定した行数〜最終行 どなたか教えて下さい よろしくお願いします