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

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

新規登録して質問してみよう
ただいま回答率
85.50%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Python 3.x

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

6105閲覧

数値,テキスト混同の.DATファイルに対して,ファイル内のデータを逐次,配列に格納したい

basketball

総合スコア5

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Python 3.x

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2020/02/23 13:14

編集2020/02/23 13:51

前提・実現したいこと

やりたいこと:Python3.xで数値とテキスト混合のデータ(.datファイル)を読み込むプログラムを作成しています.
最終的な目的:格納した配列からグラフを作成したり,数値計算をする.
→まず,生データを整理したい.

■ データの中身
このデータはある計測装置から直接吐き出されるもので,
ダブ区切りでもカンマ区切りでもなく,独自のフォーマットです.


data (A) = 8.449E-19 -1.406E-04 -1.711E-04 8.832E-04 1.156E-03
(スペース連続) 1.985E-03 1.051E-03 8.782E-04 5.164E-04 3.921E-04
(改行)
data (B) = -9.936E-06 -1.504E-04 -1.712E-04 8.980E-04 1.274E-03
(スペース連続) 2.044E-03 1.040E-03 8.514E-04 4.703E-04 3.700E-04
(改行)
...と以下続く.----------------------------------------------------------------
※数字が5つ続いたら,改行して,先頭を揃えてまた5つ数字がならぶ.'-'符合分はずれる
※.DATファイルはテキストです.

■ 実現したいこと
STEP1:DATA.DATを読み込む.先頭から1行ずつ読んでいく.
STEP2: data (A) = という名前がきたらdata_A 名前の空配列を作成し,8.449E-19 ~ 3.921E-04まで(上の事例では2行分)格納
STEP3: dataB以降も同様.ループで最後(データがないところ)まで続ける.

該当のソースコード

python

1 2import re 3import pandas as pd 4 5pattern=re.compile(' +') # 正規表現でスペースが1個以上続くものを抽出 6ifile = 'DATA.DAT' # 本文のようなデータ 7fout = open('c'+ifile.split('.')[0]+'.csv','tw') # 出力ファイル名を入力ファイルから命名してopen 8 9with open(ifile,'tr') as fin: 10 for iline in fin: 11 fout.write(pattern.sub(',',iline)) #一文字以上のスペースをカンマに置換→ここのループで処理したい 12 13fout.close() 14 15 16Dummy_names = [ 'c{0:02d}'.format(i) for i in range(10) ] #疑似的なヘッダー 17df = pd.read_table('cDATA.csv','r',names=Dummy_names, delimiter = ",") #今はとりあえずDataFrameで中身を見ている 18

試したこと

1.pandas でDateFrameとして読み込み.
→1つの1つの要素に1行分すべてはいってしまう.
例:「data (A) = 8.449E-19 -1.406E-04 -1.711E-04 8.832E-04 1.156E-03」ここまで1要素にはいってしまう.

2.スペース区切りとも言えない感じなので,with openでパスを指定し,一度,CSVに変換する.スペースを','に置きかえ(記載ソース)
↓結果
,Y,IN(I),=,8.449E-19,-1.406E-04,-1.711E-04,8.832E-04,1.156E-03
,1.985E-03,1.051E-03,8.782E-04,5.164E-04,3.921E-04

→これをPandasのread_csvで読む
1要素ずつデータは格納されたが,さらに後処理するの

ここからまとめるのもいいが,
初期のforループで配列格納を逐次行いたい

補足情報(FW/ツールのバージョンなど)

Spyderで作業しています.

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

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

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

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

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

meg_

2020/02/23 13:43

・コードは「コードの挿入」で記入してください。 ・DATファイルの中身はテキストなのですか?
basketball

2020/02/23 13:57

コードの挿入にて記載・修正しました DATの中身はテキストです
guest

回答1

0

ベストアンサー

以下のような感じで正規表現で=~改行~改行改行の単位で抽出していけばよいかと思います。

Python

1import re 2from io import StringIO 3 4# テストデータ 5s = """data (A) = 8.449E-19 -1.406E-04 -1.711E-04 8.832E-04 1.156E-03 6 1.985E-03 1.051E-03 8.782E-04 5.164E-04 3.921E-04 7 8data (B) = -9.936E-06 -1.504E-04 -1.712E-04 8.980E-04 1.274E-03 9 2.044E-03 1.040E-03 8.514E-04 4.703E-04 3.700E-04 10 11""" 12datas = StringIO(s).read() # 全部読み込む 13datas += '\n\n' # 念のため番兵をつける 14 15# 1行分の文字列を数値リストに 16def to_list(s): 17 return [float(e) for e in re.split(r'\s+', s.strip(' '))] 18 19data = {} 20for m in re.finditer(r'data ((.*?)).*?=(.*?)\n(.*?)\n\n', datas, re.MULTILINE): 21 line = to_list(m.group(2)) + to_list(m.group(3)) # 2行 -> 1行の数値リストに 22 data[m.group(1)] = line 23 24print(data) 25#{'A': [8.449e-19, -0.0001406, -0.0001711, 0.0008832, 0.001156, 0.001985, 0.001051, 0.0008782, 0.0005164, 0.0003921], 'B' 26#: [-9.936e-06, -0.0001504, -0.0001712, 0.000898, 0.001274, 0.002044, 0.00104, 0.0008514, 0.0004703, 0.00037]}

投稿2020/02/23 13:46

編集2020/03/07 14:23
can110

総合スコア38233

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

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

basketball

2020/03/07 14:16

回答ありがとうございます。 上記のコードで ret 内にデータを格納することができましたが, ■ 実現したいこと:STEP2,STEP3の 「data_A」なる変数名に格納→次の変数も逐次格納する のやり方がわかりません. 空行列を先にたくさん作って,接頭語と一致したらその値を格納するイメージをもって 作っていますが,うまくいきません. なにか方法はないでしょうか.
can110

2020/03/07 14:24

回答修正しました。 data_Aなりの変数に格納するのは煩わしいのでdataという辞書に'A'などをキーとして格納しています。
basketball

2020/03/07 14:51

回答ありがとうございました.回答を参考に作成してみます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問