質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

2回答

190閲覧

文字列処理(ログ処理)について

k10lie

総合スコア10

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

0クリップ

投稿2019/01/16 14:49

編集2019/01/16 15:37

申し訳ありません。体裁を直しました。

こんばんは。スクリプトの書き方でよいアイディアがわからず相談をさせて下さい。

1時間に1回ログを取り、それが1つのテキストファイルに以下のように書かれているファイルがあります。左が ID, 右がその ID が出力する任意の値です。
左の値は 1 から 20 まであります。
右の値は 0 から 60 まであります。

左の値 (ID) は、ログを取るタイミングであったりなかったりします。
(なので、以下の例の場合 2回のタイミングでログをとったことを意味しますが ID=1 が 2回出力されています。一方 ID=2,9,10,11 は 1回だけ出力されています)。
なお ID が 3つ出力される時もあれば 3つ以外の時もあります。

test.txt

text

1---------------------- 210 50 31 38 49 40 5---------------------- 600:00:00 7 8---------------------- 911 50 102 40 111 38 124 29 13---------------------- 1401:00:00

規則性は "----------------------" にはさまれおります。
この間を並び替えたいです。

実現したいことは以下です。

  1. "----------------------" の間の ID を横に並べる (エクセルで整理するので1行目に相当)
  2. 時間を A 列に並べる
  3. ID に対応する値を ID ごとにならべる

以下のようなイメージです。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 00:00:00 38 40 50 01:00:00 38 40 29 50

恐れ入りますが、アイディアをいただけないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KojiDoi

2019/01/16 15:02

これでは入力/出力の形式がどうなっているのかさっぱり分かりません。 ヘルプの「対応しているMarkdownの機能を知りたい」の項に書いてある「コード」か「表」の説明を読んで、入出力それぞれの例を書いてみてください。
y_waiwai

2019/01/16 15:06

例のログが見づらいので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にログを貼り付けてください
guest

回答2

0

普通に段落区切りなのだから、段落毎に処理するのが楽かな。
以下のコードでは、時刻文字列 == 段落の(解析対象の)最後って書き方をしてるけど。

#!/usr/bin/env perl use strict ; use warnings ; # ヘッダ出力 printf "%s\n", join "\t", '', 1 .. 20 ; # 出力用配列(20要素は、''で初期化) my @d = ('')x20; # ファイルを嘗める。 while(<>){ # 数値行以外無視 next if !/^\d/ ; # 改行排除 chomp; # 空白で行を分割 my @c = split ; # データ行なら、出力用配列にデータをセットしてnext # (お行儀の面から--$c[0]してる) $d[--$c[0]] = $c[1] and next if @c == 2 ; # それ以外の行なら、 時刻と配列を出力。 printf "%s\n", join "\t", $_, @d ; # 配列再初期化 @d =('')x20; }
$ perl THIS.pl test.txt 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 00:00:00 38 40 50 01:00:00 38 40 29 50

投稿2019/01/17 13:22

bunzaemon

総合スコア118

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k10lie

2019/01/19 09:03

KojiDoi さん ありがとうございます。いただいたアドバイスで作成をしてみます。 取り急ぎまずはお礼とさせてください。
guest

0

基本的には次のように考えれば良いでしょう。

データを一行づつ読み、
0. 00 00 の形式 - データをハッシュに蓄積。
0. 00:00:00 の形式 - 蓄積したデータを出力した後、リセット
0. それ以外 - 普通に無視

データの蓄積についてですが、IDと値の対応関係に応じて、$data{10}=50;のような形でハッシュに保持していけば良いです。ことさら「並べ替える」を意識する必要はありません。出力時にID順に処理していけばいいことです。出力が終わったらundef %data;して蓄積したデータをご破算にすることを忘れない。それで続けて次のタイムスタンプのデータの処理に移れます。

投稿2019/01/16 16:20

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k10lie

2019/01/19 09:03 編集

bunzaemon さん ありがとうございます。いただいたアドバイスで作成をしてみます。 取り急ぎまずはお礼とさせてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問