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

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

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

Automatorは、作業を自動化するワークフロー構築ソフトウェア。Macに標準で搭載されています。ドラッグ&ドロップ操作で自動化レシピを作成。任意のショートカットキーで実行することが可能です。

Q&A

解決済

1回答

510閲覧

Automaterで複数txt結合時に、結合結果にファイル名も出力したい

NN77

総合スコア60

Automator

Automatorは、作業を自動化するワークフロー構築ソフトウェア。Macに標準で搭載されています。ドラッグ&ドロップ操作で自動化レシピを作成。任意のショートカットキーで実行することが可能です。

0グッド

0クリップ

投稿2022/03/24 06:19

編集2022/03/24 06:23

以下の質問を参考に、複数txtファイルのaaa.txtとbbb.txtを結合しようとしているのですが、その際どちらのファイルから取得したデータなのかがわかるように、1列目のカラムにファイル名を出力したいです。
https://teratail.com/questions/354025?fbclid=IwAR0amXFr26np97agaItD6-F8cBXsbe1lTY9A-GNRonbykDHDkys0SnAxg6w

例:aaa.txtとbbb.txtの結合結果で、結合結果.txtの結果を得たい
aaa.txt

id会社名住所
1株式会社あああ東京都

bbb.txt

id会社名住所
2株式会社いいい大阪府

結合結果.txt

ファイル名id会社名住所
aaa.txt1株式会社あああ東京都
bbb.txt2株式会社いいい大阪府

おそらく以下のシェルスクリプトになんらか追記をすることでできる気がしたのですが、コードがわからず、、お分かりになる方がいらっしゃればアドバイスいただけないでしょうか。(※ファイルがimportエラーを起こすためこちらのシェルスクリプトを実行しています)。シェルスクリプトから以外の実行方法でも構いません。

import os import sys merged_text = "" for file in sys.argv[1:]: with open(file) as f: merged_text += f.read().decode('cp932') merged_filename = "結合テキスト.txt" dirname = os.path.dirname(sys.argv[1]) with open(os.path.join(dirname, merged_filename), "w") as f: f.write(merged_text.encode('utf-8'))

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

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

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

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

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

guest

回答1

0

ベストアンサー

AutomatorはmacOSのものでしょうか。
でも、スクリプトを見るとPythonのようですね。
行ごとにファイル名をつけないといけないようでしたので、改行で分割して、それぞれの行にファイル名をつけるようにしてみました。
(cp932のエンコーディングだと私の環境ではエラーになってしまうようでしたのでshift_jisにしました)

py

1import os 2import sys 3 4merged_text = "" 5for file in sys.argv[1:]: 6 with open(file, encoding='shift_jis') as f: 7 basename = os.path.basename(file) 8 text = f.read() 9 array = [f'{basename},{x}' for x in text.splitlines()] 10 text2 = '\n'.join(array) + '\n' 11 merged_text += text2 12 13merged_filename = "結合テキスト.txt" 14dirname = os.path.dirname(sys.argv[1]) 15with open(os.path.join(dirname, merged_filename), "w") as f: 16 f.write(merged_text)

追記

追記のさらに編集です。

手元の環境の2系はPython 2.7.18でしたので、このバージョンで動くように修正してみました。
(1行目のcodingを指定しないとmerged_filenameの宣言の行でエラーになりましたので追加しています)
(ファイルの名前に日本語が含まれるとエラーになるので、basenameの宣言の行にもdecodeを入れました。多分utf-8で大丈夫と思うのですがどうでしょうか。)

py

1# coding=utf-8 2import os 3import sys 4 5merged_text = "" 6for file in sys.argv[1:]: 7 with open(file) as f: 8 basename = os.path.basename(file).decode('utf-8') 9 text1 = f.read().decode('cp932') 10 array1 = [basename + ',' + x for x in text1.splitlines()] 11 text2 = '\n'.join(array1) + '\n' 12 merged_text += text2 13 14merged_filename = "結合テキスト.txt" 15dirname = os.path.dirname(sys.argv[1]) 16with open(os.path.join(dirname, merged_filename), "w") as f: 17 f.write(merged_text.encode('utf-8'))

投稿2022/03/24 08:54

編集2022/03/25 14:35
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

NN77

2022/03/25 13:20

ご回答いただきありがとうございます! >AutomatorはmacOSのものでしょうか。 はい、そうです。 早速試してみたのですが、以下のエラーが出てしまいました。。何が原因か見当がつけばアドバイスいただけますと幸いです。 アクション“シェルスクリプトを実行”でエラーが起きました: “ File "<string>", line 9 array = [f'{basename},{x}' for x in text.splitlines()] ^ SyntaxError: invalid syntax”
退会済みユーザー

退会済みユーザー

2022/03/25 13:41

コメントありがとうございます。 arrayの部分でエラーになっているようですね・・ こちらでは大丈夫だったのですが、arrayではだめなのですかね・・ ターミナルから次のコマンドを入力した場合のバージョンをご確認いただけますでしょうか。 python3 --version python --version Pythonはインデントに注意しないといけませんので、arrayの行はスペースの数(またはタブ?)が前後の行と同じになっているでしょうか。
NN77

2022/03/25 14:06

早速ありがとうございます。 >python3 --version コマンドライン・ディベロップメントツールを入れないときかないコマンドというエラーが出てしまい、インストールに時間がかかりそうです。またわかり次第アップします。 >python --version は以下でした。 Python 2.7.16 また、編集いただいたarray1のバージョンで試したところ、今度は別の箇所でエラーが出ています。 何度も申し訳ありません。。 アクション“シェルスクリプトを実行”でエラーが起きました: “Traceback (most recent call last): File "<string>", line 6, in <module> TypeError: 'encoding' is an invalid keyword argument for this function”
退会済みユーザー

退会済みユーザー

2022/03/25 14:12

コメントありがとうございます。 > コマンドライン・ディベロップメントツールを入れないときかないコマンドというエラーが出てしまい、インストールに時間がかかりそうです。またわかり次第アップします。 すみません、Python3系はインストールはしなくて大丈夫です。 Python2.7だったのですね。 私の環境ではPython3.8だったので3系の命令で記述してしまいました・・ ちょっと2系でも動くように見直してみたいと思います。 少々お待ちください。
退会済みユーザー

退会済みユーザー

2022/03/25 14:35

追記の部分のコードを置き換えました。 どうでしょうか。 実際にやってみると、Python2系と3系で違うものですね・・
NN77

2022/03/25 14:54

誠にありがとうございます!!!無事に欲しいデータが取れました。とても迅速なご回答に感謝します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問