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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

418閲覧

テキスト文字列における":"と","で区切ってcsv化したい

katamalix

総合スコア30

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/01/24 08:32

前提

txt

1data 0: 10, 20 2data 1: 20, 30 3data 2: 30, 40 4data 3: 40, 50 5data 4: 50, 60 6data 5: 60, 70

の形式で記述されたテキストファイルがあります。
このファイルにおける:,を目印にして、以下のようなcsvファイルを作成したいです。
イメージ説明

試したこと

Python

1with open(filename, encoding="shift-jis") as f: 2 lines = f.readlines()

はじめに、上記の処理によりテキストを1行ずつリストに格納することを試みました。
その上で、split()によるテキスト分割をしようと思い 試行したところ以下の出力となりました。

Python

1data = linlines[0].split() 2#['data', '0:', '10,', '20']

data[0]およびdata[1]が分割されてしまってる上に、data[2]に余計な,が含まれる結果となってしまいました。
解決策をご教授いただけるとありがたいです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

python

1import re 2 3filename = 'data.txt' 4with open(filename, encoding="shift-jis") as f: 5 csv_lines = f.read().translate(str.maketrans({' ': '', ':': ','})) 6 #csv_lines = re.sub(r'[ :]', lambda g: {' ': '', ':': ','}[g[0]], f.read()) 7 8print(csv_lines) 9 10# data0,10,20 11# data1,20,30 12# data2,30,40 13# data3,40,50 14# data4,50,60 15# data5,60,70

投稿2023/01/24 08:56

編集2023/01/24 09:02
melian

総合スコア19618

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

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

katamalix

2023/01/24 08:57

ありがとうございます。 このようにスマートに記述できることに感動しました。 参考にさせていただきます。
melian

2023/01/24 09:03

str.translate() の方が簡便なので、そちらに書き直しました。(import re が不要になります)
katamalix

2023/01/24 09:59

ありがとうございます。 質問ではtxtファイルを読み込むことを想定した記述としましたが、 実際は膨大なtxtファイルから該当部分を抽出したオブジェクトを操作しております。 すなわち、 with open(filename, encoding="shift-jis") as f: lines = f.readlines() lines_len = len(lines) line_arr = np.array(lines) smp_start = np.where(line_arr=="START")[0][-1] smp_end = np.where(line_arr=="END")[0][-1] smp_data = lines[smp_start:smp_end] のような操作をしており、smp_data (リスト) が手元にある状態です。 このリストを一旦txt出力し、再度with文で読ませればmelian様の記述した文で対応できるのですが、 txt出力を介さない方法があればご教授頂きたいです。
katamalix

2023/01/24 10:24

for i in range(len(smp_data)): smp_data[i] = re.split( ",|:",smp_data[i].translate(str.maketrans({' ': '', ':': ',', '\n': ''}))) この記述とし2次元配列化、to_csv()で実現できました。ありがとうございました。
guest

0

以下のような手順はどうでしょうか。

  1. 行からすべての空白を削除。
  2. 「:」 で分割する。
  3. 2つめを「,」で分割する。

re.split()を使えば「:もしくは,で分割する」もできますね。

投稿2023/01/24 08:46

TakaiY

総合スコア12657

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

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

katamalix

2023/01/24 08:57

なるほど、はじめに空白を詰めてしまえば「空白で分割」したときに","が残ることもないですね。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問