hogehoge_1_1_1.txt
hogehoge_1_2_3.txt
というファイル名であった場合、
hogehoge_1_1_1.txtからは1 1 1
hogehode_1_2_3.txtからは1 2 3
というふうにファイル名の他に数値もテキストファイルに出力したい場合どのようにすればできるでしょうか?
このように単純な作業なのですが、
このような形式のテキストファイルが大量にあって、まとめて処理してグラフなんかを作成したいために質問させていただきました。
回答よろしくお願いします。
補足
説明が不足していましたが、実行ファイルと同じフォルダに入れたテキストファイル等すべてから、ファイル名を指定しないで数値の部分だけを取り出すようにするにはどうしたらいいかも知りたいです。
分かりにくい説明かもしれませんが、回答よろしくお願いします。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
C++でのコード例はだれか書いてくれるでしょうから、別案のアドバイス。
> hogehoge_1_1_1.txtからは1 1 1
> hogehode_1_2_3.txtからは1 2 3
Cのコードを書くまでもなく、シェルスクリプトとかで、抽出したほうが手っ取り早いと思います。
たとえば、Windowsのコマンドプロンプトからなら、こんな感じ:
@for /F "usebackq delims=_. tokens=2,3,4" %d in (`dir /b hoge*`) do @echo %d %e %f
この回答への補足
分かりやすい回答ありがとうございます。
もしもで、できればでんすが、このコマンドの単語の意味を教えていただくことはできないでしょうか?
コマンドプロンプトをあまり使ったことがないもので。
もしできれば、外にテキストファイルのような形で出力したい場合はどうすればいいのでしょうか?
質問を繰り返してしまいすいません。
No.2
- 回答日時:
Cなら opendirでディレクトリを開いて
readdirで1エントリーずつ読みこんで、
ファイル名を確認して、sscanfあたりで数値を抜き出して
...
ってなるでしょうね。
ちなみに、私なら
Cのプログラムではコマンドライン引数でファイル名を渡すようにして、ファイル展開はシェルやコマンドプロンプトに任せる
とか、
全部シェルスクリプトやPerlとかで書く
とかしますね。
こんなところに時間かけるくらいなら、肝心の計算部分に注力したいので。
この回答への補足
なぜ、C++のプログラムでという形で質問したかというと、c++のプログラムですでに、実験の数値の並んだファイルの平均とその分散を取り出すプログラムを持っているんですが、ファイル名の情報を取り出す作業がそれではできないものなんです。
だから、そのソースコードを書きなおして、上で言うような機能を付けてやろうと思っていたところだったんです。
説明が十分でなくてすいませんでした。
No.3
- 回答日時:
#include <iostream>
#include <sstream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string input = "hogehoge_1_23_456.txt";
replace_if(input.begin(),input.end(),[](char ch) { return ch < '0' || ch > '9';},' ');
istringstream stream(input);
int result;
while ( stream >> result ) cout << result << endl;
}
No.4
- 回答日時:
他の回答者さんと同じく、僕もこういう仕事はあまりC/C++向きではないと思います。
Windowsだったらコマンド プロンプトやPowerShell、UNIXだったらシェル、クロスプラットフォームだったらPerlなどのスクリプト言語を使ったほうが楽です。
特にファイルまわりはOSの機能を利用しないといけないので、C/C++であれば直接APIを呼ばないと返って面倒になります。環境依存しないコードを書こうと思ったら、boost::filesystemのようなラッパーを使わないといけないし……
僕だったら下記のようなPythonコードを使って、出力結果をログファイルにリダイレクトします。
import glob, re
flist = glob.glob('*.txt')
for fname in flist:
m = re.search('hogehoge_(\d)_(\d)_(\d)\.txt', fname)
print fname + ' ' + m.group(1) + ' ' + m.group(2) + ' ' + m.group(3)
(インデントの全角スペースはタブか半角スペースに置換する必要があります。Windows 7 x64, IronPython 2.6.2 でテストしています)
No.5
- 回答日時:
(「c++で」とあるのに・・・、どっぷりCで申し訳ない)
>ファイル名を指定しないで数値の部分だけを取り出す・・
・ファイルを探す。
・ファイル名中の数字列を、atoi で数値化する。
で、できると思います。
なお、C標準関数だけではフォルダからファイルを検索する方法はありません。
下の例は、C++Builder 5. の場合です。
他の環境でも、関数などが用意されていると思いますので、環境依存部分(◆)を変更し、試して下さい。
( return( 1 ); は、「サクラエディタ」の「外部コマンド実行 → 表示」用のもので他意はありません)
#include <dir.h> // ◆ VC++ なら io.h ?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N_CNT 3 // ファイル名に含まれる数値の数
#define DLMT '_' // 数値と数値の区切り文字
int main()
{
int iVal, iDone, iCnt;
char *p;
struct ffblk sInfo; // ◆構造体名
iDone = findfirst( "Z:/temp/*.*", &sInfo, FA_NORMAL ); // ◆関数名、引数
while( ! iDone ){
printf( "%s", sInfo.ff_name ); // ◆構造体メンバ名
p = sInfo.ff_name; // ◆ 〃
iCnt = 0;
while( iCnt < N_CNT ){
p = strchr( p, DLMT );
if( NULL != p ){
iCnt++;
p++;
iVal = atoi( p ); // 「数値の部分だけを取り出す」
printf( "\t[%d] %d", iCnt, iVal );
}
else break;
}
printf( "\n" );
iDone = findnext( &sInfo ); // ◆構造体名、引数
}
return( 1 );
}
注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/08 11:02
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/02/05 09:55
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/09 10:33
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/16 14:36
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:12
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/03 13:18
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
forfilesで検索したファイルを...
-
VBAでワークシートを引数として...
-
バッチ処理でファイルの中身を...
-
COPYコマンドで結合すると余計...
-
拡張子を元に戻す
-
cshでファイルサイズ取得
-
.txtではなく.logの方が良いの...
-
renameコマンドについて
-
多数のサブディレクトリ内のフ...
-
バッチファイルで文字列削除に...
-
ファイルを処理中に次の処理に...
-
【Excel】 VBAを使って毎回名前...
-
Unicode 対応の sed って無いの...
-
テキストファイルで提出とは?
-
テキストファイルの内容を連結...
-
C言語、ファイルの存在チェック...
-
テキストファイルのファイル名...
-
Excelで、大量のファイルをテキ...
-
バッチファイルで、リムーバル...
-
VBAでエクセルをtxtに変換する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチ処理でファイルの中身を...
-
VBAでワークシートを引数として...
-
.txtではなく.logの方が良いの...
-
拡張子を元に戻す
-
多数のサブディレクトリ内のフ...
-
COPYコマンドで結合すると余計...
-
バッチファイル 複数ファイル...
-
テキストファイルで提出とは?
-
バッチファイルで文字列削除に...
-
Windowsのバッチファイルを利用...
-
テキストファイルのファイル名...
-
ファイルの最後に文字列挿入
-
psqlでエラーログをとりたい
-
forfilesで検索したファイルを...
-
バッチファイルからVBAに引数を...
-
accessでSQL文を使ってcsvファ...
-
テキストファイルのタブをカン...
-
MATLABで行列を配列に格納する方法
-
renameコマンドについて
-
【Excel】 VBAを使って毎回名前...
おすすめ情報