はじめまして。
<テキストの中身>
a=1,5,3,4,
:
:
b=
_,5,6,88,-300,
200,14,500,600,
: :
: :
_,-100,200,650,100, ←ここからは新しいブロック
: :
: :
c=-300,500,・・・・・
: :
: :
とあります。
上記データのb=の部分で「_,・・・」から
次の「_,・・・」の上の行までが1ブロックになっています。
そのブロックごとに最小値と最大値のみ抜き出して
表示したいのですが、どの様にしたらよいでしょうか?
データをCSVに落とそうとしましたが
約20万行^^;データがあるので無理でした。
長く、分かりづらいと思いますけどどなたか
ご教授願います。
ルールがみえないですね。
「=」の直後に改行があったりなかったり、
行頭に半角スペースがあったりなかったり、
最初の数値項目の前にアンダーバーがあったりなかったり…。
「ブロック」の定義も不明ですし、
ブロックの区切りをどう判断していいかわからないし…。
>「_,・・・」から次の「_,・・・」
「・・・・・」がかかれている行は一箇所しかないし・・・。
次のってどこ?
まずフォーマットを明確にしてください。
まあ、原理としては、「ブロック」ごとに数値を次々に読み込んで、
順に比較していけば求められるはずですが、
速度の問題は残りそうですね。
そもそも、なんで20万行のテキストデータがあるのか不思議ですが・・・。
なんかの受信データ?
Sayさん、ご返事ありがとうございます。
すごいフォーマットが不明確(書き方が悪く)て
申し訳ございませんでした。
改めてもう一度書きます。
a=
1,5,3,4,
:
:
b=
_,5,6,88,-300, ←ここからブロック始まり
200,14,500,600,
: :
: :
150,400,25,300, ←ここまで1ブロック
_,-100,200,650,100,
: :
: :
250,10,-300,74,
c=
-300,500,・・・・・
最初の数値のアンダーバーは「b」にしかありません。
また、ブロックは約500くらいあります。
速度の問題は今回、あまり気にしてません^^;
これはSayさんのおっしゃるとおり、ある受信データです。
よろしくお願いします。
Sayさん、私はかなり間違った説明を書いてしまいました。
すみませんでした。
もう一度書きます。
a=
1,5,3,4,
:
:
b=
5,6,88,-300,
200,14,500,600,
: :
: :
150,400,25,300,
-100,200,650,100,
: :
: :
250,10,-300,74,
c=
-300,500,・・・・・
上記で「b」欄のデータを500個ずつ抽出し、
それぞれの最大値、最長値を表示したいです。
その時、はじめは上記数値で5から500個抽出。次はその次の
6から500個、8から500個・・・・と一つずつずらして500個
数値を抽出。
上記どうかよろしくお願い致します。
やっぱりルールとフォーマットが明確でないですね。
いずれにしても1行ずつ読み込んで、判断して、
切り分けて、数えて、格納することになるでしょう。
1行の要素数とか1ブロックの行数とか、行頭のスペースの有無とか
明確なフォーマットが決まってるなら、ロジックが少し簡単になるでしょう。
>上記で「b」欄のデータを500個ずつ抽出し、
>それぞれの最大値、最長値を表示したいです。
>その時、はじめは上記数値で5から500個抽出。次はその次の
>6から500個、8(88?)から500個・・・・と一つずつずらして500個
>数値を抽出。
この文章から私は次のように解釈しました。
1番目の値から500番目の値のデータでの最大値、最長値(最小値?)を表示
2番目の値から501番目の値のデータでの 〃
:
:
500番目の値から999番目の値のデータでの 〃
このことから次のような方法が考えられます。
最初に1番目から500番目の値までの最大値、最小値を検索、表示
そして次のブロックの検索のためにその値と位置(何番目か)を記録する。
次の2番目から501番目の値までの場合は2から500番までの最大値、
最小値は判っているのでその値と501番目の値の比較だけですみます。
ただし、最大値または最小値が1番目の値だった場合は2から501番の
ブロックから外れるので最大値または最小値を検索しなおす必要があります。
これを500回繰り返す。
この方法ならプログラムのサイズも大きくなく、時間も短縮できると思います。