アプリ版:「スタンプのみでお礼する」機能のリリースについて

テキストファイル(20220101.txt、20220102.txt…)が1日毎に一年分あります。
中身は、下記のような形式です。
20220101000000+012345+054321+098765+056789
(年月日時分秒センサーaセンサーbセンサーcセンサーd)
こちらは30秒ごとのデータなのですが、00秒のデータを抜き出して1分ごとにして、さらにファイル毎に下記のような形式に変換したいです。
22/01/01,00:00,+ 54321
(年/月/日,時:分,センサーb)
※センサーbの値の+と54321の間の0を半角スペースに変換

Linuxで、cutやawkなどを使って試しているのですが、なかなかうまくいきません。linuxかpythonで変換する方法を教えていただけると嬉しいです。
よろしくお願いします。

質問者からの補足コメント

  • うーん・・・

    早速ご丁寧にご回答いただき誠にありがとうございます。
    教えていただいたものを試そうとしているのですが、python超初心者であり、本を片手にやっていもなかなかすんなり実行までたどり着けません。
    こちらは、教えていただいたスクリプトを.pyファイルに書き込んで、コマンドプロンプトから実行するという理解でよろしいでしょうか。
    また、データの中ではセンサーの区別はなく、ただの数字の列挙の状態なのですが、指定の列を切り出す場合は、列番号で指定をした方がいいのでしょうか。

    No.1の回答に寄せられた補足コメントです。 補足日時:2023/08/08 17:37
  • ご確認いただきありがとうございます。

    1.センサーはbのみで、かつ、abcdの名前は、今回の質問でデータの構造がわかりやすいように勝手につけたものです。実際のデータの中ではabcdの区別はなく、タイトル行もなく、ただセンサーの順に値が並んだ、数字の列挙のみとなってます。なので、列番号で指定して必要な箇所のみを抜き出すことを想定していました。

    2.仮に+000321の場合、+ 00321としたいです。先頭には全てゼロがついている6桁の数字なのですが、先頭のゼロを消して5桁にして、+と数字の間に半角スペースを入れたいと考えています。

    3.2.のとおり、数字は全て6桁で、先頭に全てゼロがついています。

    4.常に+で、−になることはありません。

    以上、よろしくお願いします。

    No.3の回答に寄せられた補足コメントです。 補足日時:2023/08/09 20:51
  • tatsumaru77さま
    早速ご丁寧にやり方も含めてお送りいただき心から感謝申し上げます。
    いただいたものを使用してファイル変換しようとしたのですが、output用のフォルダに何も作成されず、エラーメッセージも出ずに終了してしまいます。
    何が原因かおわかりでしょうか‥。

    No.4の回答に寄せられた補足コメントです。 補足日時:2023/08/10 10:55
  • 早速お返事ありがとうございます。

    何も出力せずに終了(新たなコマンドを打つ行に移る)してしまいます。
    超初歩的な確認で申し訳ないのですが、こちらはコマンドプロンプトから実行するという理解でよろしいでしようか。

    No.5の回答に寄せられた補足コメントです。 補足日時:2023/08/10 14:32

A 回答 (8件)

No3です。

補足ありがとうございました。
ソースは下記URLにアップしました。
https://ideone.com/lzJuIF
(このサイトにアップするとインデントがくずれてしまいます。pythonの場合、インデントが崩れると正しく動作しません)

使い方の説明
本ソースをファイルに格納してください。(sample.pyとします)
コマンドラインで以下のように入力してください。
python3 sample.py 入力ディレクトリ名 出力ディレクトリ名 センサー名
① 入力ディレクトリ名:テキストファイル(20220101.txt、20220102.txt…)を格納したディレクトリ名
②出力ディレクトリ名:変換したファイルを出力するディレクトリ名
(存在するディレクトリを指定してください。存在しないとエラーになります)

③センサー名:a,b,c,dの何れかを指定します。提示例では、bを指定したケースです。

④変換後のファイル名は、以下のようになります。
変換後のファイル名:s+センサー名+"_"+元のファイル名
例 20220101.txt をセンサー名=b で実行すると
変換後のファイル名は
sb_20220101.txt となります。

⑤usage 表示
python3 sample.py と引数を入力せずに実行すると
too few arguments!
sample.py input_dir_name output_dir_name sensor_name(a,b,c,d)
のようにusageが表示されます。

⑥使用例
現在のディレクトリ下に
sample.py
in2023・・・入力ディレクトリ
out2023・・・出力ディレクトリ
があり、
in2023下のテキストファイルを処理し、out2023下へセンサーaの値を出力する場合、
python3 sample.py in2023 out2023 a
と入力します。


不明点があれば補足してください。
この回答への補足あり
    • good
    • 1

>linuxで当初のご指示の通り動かしたところ、必要としていた形式で全てのデータが作成されました。



了解です。上手く行って良かったです。
    • good
    • 0

>こちらはコマンドプロンプトから実行するという理解でよろしいでしようか。


はい。その通りです。

>何も出力せずに終了(新たなコマンドを打つ行に移る)してしまいます。
スクリプト自体が実行されていないように思われます。

環境はlinuxで間違いないですね。
基本的なlinuxのコマンド
ls
pwd
等を入力した場合は、正しく反応していますか?
lsならファイル一覧が表示されます。
pwdなら現在のディレクトリが表示されます。
    • good
    • 0

No5です。


1.もし、0 files converted.が表示されているなら、
入力ディレクトリ下に処理対象となるファイルが存在しないとスクリプトが判断していることになります。

処理対象となるファイル名は、
数字8桁+.txt  です。
20220101.txt は処理対象となりますが、
20220101.TXT は処理対象外です。
拡張子は.txt(小文字)になってますか。

2.もし、0 files converted.が表示されていないなら、
python3 sample.py と入力したときに
too few arguments!
sample.py input_dir_name output_dir_name sensor_name(a,b,c,d)
と表示されますでしょうか。
(sample.pyは当該スクリプト名です。あなたの実際のスクリプト名に読み替えてください)
    • good
    • 0
この回答へのお礼

助かりました

ご丁寧に素早いご回答、本当にありがとうございました。
こちらの知識不足で、linuxではなくwindowsで実行しようとしていました。linuxで当初のご指示の通り動かしたところ、必要としていた形式で全てのデータが作成されました。
この度は、誠にありがとうございました。

お礼日時:2023/08/11 17:19

>output用のフォルダに何も作成されず、エラーメッセージも出ずに終了してしまいます。



下記のメッセージも出力されていませんでしょうか?
xxx files converted.

xxxは処理されたファイルの件数です。
1件も処理されていないなら、
0 files converted.
と出力されるはずですが、このメッセージも出力されていないのでしょうか。
この回答への補足あり
    • good
    • 0

補足要求です。


1.提示例では、センサーbの値を出力していますが、
センサーa,c,dの値を出力することもあり得ますか。
もし、そうであれば、スクリプト起動時に、センサー名(a,b,c,dの何れか)
を指定して、指定されたセンサーの値を出力するようにした方が良いかと思いますが、いかがでしょうか。

2.センサーbの値が+054321の場合、0の箇所をスペースに置き換えて出力していますが、もしこの値が、+000321の場合は、000をスペース3個に置き換えるのでしょうか。

3.センサーの値は+054321のように提示されていますが、数字は必ず6桁なのでしょうか。

4.センサーの値は+054321のように提示されていますが、+でなくー(マイナス)の場合もあるのでしょうか。
例 -054321 等
この回答への補足あり
    • good
    • 0

Linuxで、cut や awk や grep や sed などを使う場合



> 00秒のデータを抜き出して1分ごとにして、
grep "^............00"

> 年/月/日,時:分
sed -E 's|^..(..)(..)(..)(..)(..)..|\1/\2/\3,\4:\5|'

> ,センサーb
sed -E 's|\+[0-9]+|,\0|g'
cut -d "," -f "1,2,4" \

> +と54321の間の0を半角スペースに変換
sed -E 's|\+0+|\+ |g'
    • good
    • 1
この回答へのお礼

ご回答いただきありがとうございます!
grep はうまくいったのですが、sed では、sed: -e expression #1, char 43: 's' コマンドの右側に無効な参照¥5があります。
とのメッセージがでてしまいました。
なぜだかお分かりでしたら教えていただけると嬉しいです‥。

お礼日時:2023/08/10 10:51

LinuxとPythonのどちらでもデータ変換が可能ですが、Pythonの方が直感的に処理しやすいかもしれません。

以下はPythonを使用してデータ変換する方法の一例です。

```python
# 必要なライブラリをインポート
import os
import re

# フォルダ内のすべてのテキストファイルを処理する関数
def process_files(folder_path):
for filename in os.listdir(folder_path):
if filename.endswith(".txt"):
input_path = os.path.join(folder_path, filename)
output_path = os.path.join(folder_path, "output_" + filename)
process_file(input_path, output_path)

# 1つのテキストファイルを処理する関数
def process_file(input_path, output_path):
with open(input_path, 'r') as input_file, open(output_path, 'w') as output_file:
for line in input_file:
# 正規表現を使ってデータを抽出
match = re.match(r'(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})00\+(\d+)\+(\d+)\+(\d+)\+(\d+)', line)
if match:
year, month, day, hour, minute, _, sensor_b, _ = match.groups()
# データを指定された形式に変換してファイルに書き込む
output_file.write(f"{year[2:]}/{month}/{day},{hour}:{minute},+ {sensor_b}\n")

# フォルダ内のすべてのテキストファイルを処理
process_files("フォルダのパス")
```

このPythonスクリプトは、指定したフォルダ内のすべてのテキストファイルを処理し、指定された形式に変換して新しいファイルに保存します。`process_files`関数がフォルダ内の全てのテキストファイルを処理し、`process_file`関数が1つのテキストファイルを処理して変換を行います。

`フォルダのパス`を適切なフォルダのパスに置き換えてスクリプトを実行してください。変換後のファイルは元のファイル名の前に"output_"が付いたファイルに保存されます。例えば、"20220101.txt"は"output_20220101.txt"に変換されます。
この回答への補足あり
    • good
    • 2
この回答へのお礼

解決しました

ご丁寧に素早いご回答、誠にありがとうございました!!!

お礼日時:2023/08/11 17:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています