• ベストアンサー

ファイルへの格納について

たとえば、12桁の数値データが何行にもわたって続いているとします。以下のように 259643258756 459831485628 123586486746   ・   ・   ・ このようなデータの上4桁と下4桁だけを取り出してファイルに各々格納し、必要な際にそれを取り出して利用するようなプログラムを作りたいときはどのようにすれば良いのでしょうか。解答をお願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.2

こんばんは 解説を一切していなかったですね。 No.1のプログラムはご質問にあった12桁の数値が入ったファイル(プログラム内ではorigin.txtとさせて頂きました。本当のファイル名があれば、変更して頂いて結構です。)を読み込んで、最初の4桁のファイル(プログラム内ではhead.txt)と最後の4桁(正確には9文字目から12文字目まで。プログラム内ではtail.txt)を自動的に生成する為だけの物です。 origin.txtファイルを用意して、下記のプログラムを仮にsample.cで、コンパイルしてsample.exeになったとして、origin.txtと同じフォルダにコピーして、実行すると、head.txtとtail.txtを作ります。 ただそれだけです。 では、プログラム自体の解説ですが、 #include <stdio.h> これはC言語ではおきまりの文ですよね。stdio.hというヘッダファイルをインクルードしています。 main() 今回は、特にプログラムにパラメータ等を与えないので、これで良いでしょう。 問題があれば、 void main(void) として下さい。 FILE *fpr,*fph,*fpt ; 今回使うファイルはorigin.txtとhead.txtとtail.txtですので、3個分のファイルポインタを定義しています。 char r[256],h[5],t[5] ; 更に、ファイルの読み書き用のデータを格納する為の入れ物を定義しています。 fpr = fopen("origin.txt","rt"); origin.txtを読み込み専用のテキスト形式で開いています。 fph = fopen("head.txt","wt"); fpt = fopen("tail.txt","wt"); 同様に、head.txtとtail.txtを書き込み専用のテキスト形式で開いています。 "rt"がreadのrとtextのt "wt"がwriteのwとtextのt ですね。 while ( fgets(r,256,fpr) != NULL ){   ・・・ } このwhileループはorigin.txtのファイルの最後に鳴ったらループから抜けると記述しています。 また、origin.txtから1行を読み込んで、rというポインタが示す領域にデータを入れています。 h[0] = r[0] ; h[1] = r[1] ; h[2] = r[2] ; h[3] = r[3] ; h[4] = '\n' ; ここまでが、origin.txtで読み込んだ1行の1文字目から4文字目までと改行の\nをhの配列に入れています。 fputs(h,fph); hの内容をhead.txtに書き込んでいます。 同様に t[0] = r[8] ; t[1] = r[9] ; t[2] = r[10] ; t[3] = r[11] ; t[4] = '\n' ; 9文字目から12文字目までと、改行の\nをtの配列に入れています。 fputs(t,fpt); tの内容をtail.txtに書き込んでいます。 最後に fclose(fpr); fclose(fph); fclose(fpt); 開いたorigin.txt、head.txt、tail.txtを閉じています。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.1

こんばんは テキスト形式のファイルですか。 適当に書いてみました。 #include <stdio.h> main() {   FILE *fpr,*fph,*fpt ;   char r[256],h[5],t[5] ;   fpr = fopen("origin.txt","rt");   fph = fopen("head.txt","wt");   fpt = fopen("tail.txt","wt");   while ( fgets(r,256,fpr) != NULL ){     h[0] = r[0] ;     h[1] = r[1] ;     h[2] = r[2] ;     h[3] = r[3] ;     h[4] = '\n' ;     fputs(h,fph);     t[0] = r[8] ;     t[1] = r[9] ;     t[2] = r[10] ;     t[3] = r[11] ;     t[4] = '\n' ;     fputs(t,fpt);   }   fclose(fpr);   fclose(fph);   fclose(fpt); }

takamako1
質問者

お礼

解答ありがとうございました。データはテキスト形式です。ただ、プログラムでコマンドの意味とかが分からないもので、具体的にどう応用したらよいものか・・・・。 もし、お暇があれば簡単な解説をしていただけるとうれしいです

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C#で、ファイルのデータを取得し、配列に格納

    C#を始めたばかりで分からないことも多いため、質問させていただきます。 C#で、テキストファイルにある2進数の数値 例: 00111100 11111100 00010100 のような8桁のデータをC#でテキストファイルから2進数のまま読み取り、 配列に格納したいです。 上の例で考えると、 byte[0]に 00111100 byte[1]に 11111100 byte[2]に 00010100  のデータが入力されているような感じです。 ArrayListを使用する方法や、 バイナリファイルで読み込む方法などもあると思うのですが、 データを1行ごとに配列に入力し、 それを見た目どおり2進数として格納する方法が分かりません。 やはり、文字コードなどを参考に、 1文字ずつ格納し、引き算していくしか方法はないのでしょうか? 文章が分かりにくくて申し訳ないのですが、回答いただけるとありがたいです! よろしくお願いいたします。

  • ファイルの読み込み、配列に格納

    お世話になります。Java初心者です Javaプログラムを実行する同じディレクトリにあるテキストファイルとデータファイルをコマンドラインで同時に読み込み それぞれ違う配列に格納したいのですが、1つのファイルの読み込みは出来ても2つ同時の読み込みと配列格納でつまづいています。 読み込むテキストファイルには以下のような1行の文が、 Dr. Fujita is great! 読み込むデータファイルには以下のような文字が書かれています。 AC 4C 7C 10C KC 3D 6D 9D QD JB 3C 6C 9C QC 2D 5D 8D JD JA 2C 5C 8C JC AD 4D 7D 10D KD 配列に格納する際、テキストファイルの場合は全て大文字にし、アルファベット以外の記号(スペース含)は全て消して配列に格納します。 上の例でいえばこのような状態で格納です↓ DRFUJITAISGREAT データファイルの場合は、2組1文字をそのまま配列に格納です。ただしスペースは飛ばします。 上の例でいえば、ACを配列0に、4Cを配列1に、7Cを配列2に、、、と格納していきます。 import java.io.*; public class sample{ public static void main(String[] args){ try{ FileReader f = new FileReader(args[0]); BufferedReader b = new BufferedReader(f); Strings; while((s=b.readLine())!=null){ System.out.println(s); ←読み込んでるか確認 } }catch(Exception e){ System.out.println(no file); } } } ファイルの指定は実行時に、java sample datafile.dat textfile.txt と指定します。 読み込むプログラムは以上のように書いたのですが、2つファイルを読み込むにはどのように記述したらよいのでしょうか。 FileReaderを2つ作成?しても最初に指定したデータファイルの内容がまた読み込まれるだけで・・・ 読み込んだら変数sに入りますが、たとえばs.substring()なんかでわけて配列に入れようとしても、s.substring()←ここでエラーが出てしまいます。 あと、Dr. Fujita is great!のアルファベットを大文字にし、記号(スペース含)を飛ばして格納するにはどうしたらよいのでしょうか。 宜しくお願いします

    • ベストアンサー
    • Java
  • 【C#】テキストファイルを2進数で取得&配列に格納

    http://okwave.jp/qa/q7812279.html 前回の質問が分かりにくかったため、もっと詳しく書いていこうと思います。 テキストファイルを1行ずつ読み取り、それをbyte型に保存したいです。 例:test.txt 01001000 01110000 01010100 11100110 01010101 ↑のような8桁の2進数がテキストファイルに記入されています。 そのテキストファイルを読み取り、 byte配列に格納したいです。 例: byte[0]に01001000 byte[1]に01110000 byte[2]に01010100 byte[3]に11100110 上記のようにデータが格納されるよう、 ファイルを読み取り、配列に入れたいと思っています。 C#初心者のため、右も左も分からないのですが、 とりあえず、やろうとしている流れを以下に書きます。 (1)ファイルを読み込む (2)ArrayListに格納 (3)データ変換(文字列を2進数に) (4)データの出力(byte型) ArrayListでなくても構わないのですが、 他にいい方法が思いつかなかったので…。 言いたいことがぐちゃぐちゃになってきたのでまとめると、 byte[0]にファイルから読み取った1行のデータ(01001011等)を byte型で入力したい。 ということです。 分からなければ、コメントお願い致します。 文章が雑で分かりにくいかもしれませんが、回答頂けると嬉しいです。

  • MDBファイル(Access)からデータを取得できなくて、困っています…

    Visual studio 2005(C#を使っています)で、mdbファイル(Access)のデータを取り込むプログラムを組もうとしているのですが、上手くいかなくて困っています。 具体的には、 (1)mdbファイルに接続 (2)mdbの1行分の複数のデータを配列にそれぞれ格納 (3)格納したデータ(数値)をグラフ上にプロット というプログラムです。教えて頂きたいのは、(1)と(2)を実現するプログラムです。何冊かテキストを読み、書かれていたサンプルプログラムを打ち込んでみたんですが、どうも上手くいきません。 宜しくお願い致します。

  • FORTRAN77の問題。

    ある直径DPのデータがdiam.datという名前のファイルに保存されている。ファイル中にはDPの測定値が1行に1つ、12けた幅の実数値で書かれている。データの終わりを示すために、最終行には測定値の代わりに-1.0が書かれている。 DPのデータをファイルから読み込み、はいれつDPに格納するとともにデータ数を数える。 というプログラムを書いてください。お願いします。

  • ファイルへの落とし方について

    先日、「教えてgoo」において「ファイルへの格納について」という題名で質問をして御助言いただいた者です。 御助言に基き以下のようなプログラムを作ってみました。 #include <stdio.h> void main(void) FILE *fpr,*fph; char r[256],h[5], fpr = fopen("origin.txt","rt");   fph = fopen("head.txt","wt");      while ( fgets(r,256,fpr) != NULL ){     h[0] = r[0] ;     h[1] = r[1] ;     h[2] = r[2] ;     h[3] = r[3] ;     h[4]=r[4]; h[5]=r[5]; h[6]=r[6]; h[7]=r[7]; h[8]=r[8]; h[9]=r[9]; h[10]=r[10];     h[24]=r[11]; h[25]=r[12]; h[26]=r[13]; h[27]=r[14]; fputs(h,fph); } fclose (fpr);       fclose(fph);   } というプログラムを書いてみました。当初の予定とは若干異なり、スペースを含む28桁のデータ(4桁毎に2つのスペースがあり、4桁が5つで1行)の最初の12桁と最後の4桁だけを取り出しそれらをくっつけて1つのファイルに落としたいと思っています。たとえば 6528 1285 1259 1238 1257 というデータならば 6528 1285 1257 というような形になるようにしたいのです。 このようなデータが何行も続いてます。 しかし、上のプログラムを実行すると 6528 1285 1257 1259 1238 のようになってしまいます。 h[i]で定義しなかったはずの部分のデータまでファイルに落ちてしまうのです。よろしければ、改善策を教えてください。お願いします。

  • VBA(多くの数値データの最小値5つを格納する方法)

    VBA(多くの数値データの最小値5つを格納する方法) 現在テキストファイルの数値データを取り出し最小値5つを書き出す動作をVBAで行うつもりでいます。 例  5    9    33    11    1    0.3    0.02     ・     ・     ・     ・ といった形の数値データ行がテキストファイルに存在します。 今現在すべての数値データを格納してエクセルに書き出しそれを並び替え最小値5つ(0を除く)を見て作業を行っております。 この作業をより効率化するために、VBAを用いて0を除いた最小値5つをエクセルシートに書き出すようにしたいのですが、VBAの知識が足らず対策が思い浮かびません。 ・VBAで行いたいこと(わからない部分) 格納するデータを5つに設定して、数値データを順次読み込み最終的に数値データ群の最小値5つ(0を除く)を配列に格納している状態にしたい。 初歩的かもしれませんが、ご回答お願いいたします。

  • 波形データを格納するデータベース

    大学院生です。実証実験のためにデータベースの使用を考えています。 専門外でわからないことだらけなので、検索の糸口だけでも頂けると有難いです。 以下の要求に当てはまるデータベース(DBMS?)にはどのようなものがあるでしょうか ・いくつかの数値データを関連付けて管理したい ・数値データの中には、波形データもある(100サンプル程度の複素数値) ・高速に入出力が出来る方が良い ・複数アプリケーションからアクセス出来る方が良い それともう数点、 一般的なデータベースで複素数値は格納できますでしょうか。別のカラムを用意して、実部虚部別で管理する必要がありますか。 データベースは列(カラム)と行(レコード)でデータを管理するようですが、波形データをデータベースに格納する際には、以下のように各サンプル値を各カラムに収容するという考え方で良いのでしょうか。グルーピングして1つのカラムに収容する方法があったりするのでしょうか。 ID カラム1    カラム2    カラム3 … 1 サンプル値1 サンプル値2 サンプル値3 … 2 サンプル値1 サンプル値2 サンプル値3 …   データ量がさほど多くなければ、すべての値をデータベースでなくアプリケーション側の変数として格納しておくという形式もとれるのかなと思っていますが、このようにした場合に起きる問題点にはどのようなものがあるでしょうか。 回答をお願いします。

  • リソースの画像をデータテーブルに格納したファイル名で表示させたいです

    現在私はITパスポート試験のテスト練習ができるプログラムを作成しています。 プログラムの流れは4択の選択肢から解答を選択して「次の問題」ボタンをクリックすれば次の問題に移行する・・・というような流れです。 基本的な流れのプログラムは完成したのですがITパスポート問題や解答には図が使われることがありこれらの図を画像としてリソースに取り込み必要に応じてピクチャーボックスに表示させようと試みています。 単純にリソースの画像を表示させるなら PictureBox1.Image = My.Resources.from *fromは画像の名前 というコードで表示させることができるのですが、画像が必要ない問題があったりする場合や次の問題に移行する際新たに画像を読み込む必要があったりします。 そのような問題に対処するためにデータテーブルにファイル名を格納して状況に応じて表示する画像を変えていきたいと考えています。 データテーブルに「問題(Question)」「画像のファイル名(QuestionImageName)」「選択肢(Answer1~4)」「解答(SelectAnswr)」「正解(CorrectAnswer」「正解の解説(Explanation)」を格納しています。 例えば My.Resources.DataSet1.DataTable1(0).QuestionImageName というようにコードを記述してもエラーがでてしまいます。 リソースのファイル指定とデータテーブルのファイル名を結びつける方法が5日間ぐらい調べているのですがどうしてもわかりません。 知恵を貸してください。よろしくお願いします。

  • CSVデータを取得・編集しTXTに保存する方法

    Excel2016のVBAで、ある時系列のCSVファイルのデータを取得・編集し、テキストファイルに保存する方法についてなんですが、やりたいことの順序としては次の通りです。 ■1. CSVファイルの保存先が特定されていないため、ダイアログで開くファイルを指定します。ただ、開く際、1ヶ月の短い期間であってもExcelの最大行数1,048,576行を軽く超えてしまうため、テキストファイルで開きます。 ■2. 開かれたファイルのデータを取得・編集します。 テキストファイルで開いたデータは、1行目から順に次のようになっています。 1行目は文字列 2003.05.04 21:00:00.626,118.99,118.94,20.8,0.6 2003.05.04 21:00:00.989,118.969,118.949,44.4,54.3 2003.05.04 21:00:01.408,118.958,118.948,28.7,0.8 2003.05.04 21:00:01.741,118.957,118.942,0.5,15.7 2003.05.04 21:00:22.638,118.953,118.943,0.5,37.7 2003.05.04 21:00:25.348,118.96,118.94,60.5,35.7 2003.05.04 21:00:26.087,118.956,118.946,8,13.6 2003.05.04 21:00:27.984,118.956,118.952,23.9,8.4 2003.05.04 21:00:49.884,118.968,118.948,3.2,47.1 2003.05.04 21:00:55.855,118.972,118.952,52.7,39.1 2003.05.04 21:01:05.362,118.971,118.961,21.5,4 2003.05.04 21:01:21.012,118.983,118.958,0.6,38.3 2003.05.04 21:01:33.806,118.984,118.964,8.8,35.1 2003.05.04 21:01:51.362,118.986,118.966,76.1,38.1 2003.05.04 21:01:52.171,118.987,118.967,47.1,39.1 2003.05.04 21:02:05.014,118.982,118.972,0.8,8.5 2003.05.04 21:02:06.232,118.985,118.965,0.9,30.9 2003.05.04 21:02:15.026,118.983,118.963,7.6,40.5 2003.05.04 21:02:19.716,118.979,118.959,11.7,32 2003.05.04 21:02:31.766,118.971,118.961,0.6,53.5 2003.05.04 21:02:49.565,118.975,118.955,8,54.3 2003.05.04 21:03:01.095,118.973,118.953,12,74 2003.05.04 21:03:12.396,118.968,118.958,31.9,64.7 ~ 最終行は改行 1行目は単なる文字列で、不要なデータのため除きます。 必要なデータは2行目からで、必ず、次のような形式になっています。 「西暦4桁」、「.」、「月2桁」、「.」、「日にち2桁」、「半角スペース」、「時間2桁」、「:」、「分2桁」、「:」、「秒小数点3桁」、「,」、「数値」(小数点桁数変動)、「,」、「数値」(小数点桁数変動)、「,」、「数値」(小数点桁数変動)、「数値」(小数点桁数変動) ちなみに、データが飛ぶことがありますが、必ず時系列になっており、恐らく途中で空白の改行はありません。 そして、データ取得に必要なデータは、年月日と時刻、2つ目の数値です。 上記のデータの2行目の例だとすると、次のようになります。 2003.05.04 21:00:00.626(●必要),118.99(×不要),118.94(●必要),20.8(×不要),0.6(×不要) 次に編集するのは、同じ1分以内の年月日と時刻の「1分間隔の年月日と時刻」、「最初の数値」、「最大値」、「最小値」、「最後の数値」、「1分間のデータの個数」で、1分間隔にしてもらいたいのです。 同じ1分以内の年月日と時刻というのは、「**:**:00.000」から「**:**:59.999」までの間です。「21:01」であれば、「21:01:00.000」から「21:01:59.999」までということになります。 例えば、「2003.05.04 21:01」であれば、上記のデータから抜き出すと次のようになります。また、1分間のデータの個数は5となります。 2003.05.04 21:01:05.362,118.971,118.961(最初の数値),21.5,4 2003.05.04 21:01:21.012,118.983,118.958(最小値),0.6,38.3 2003.05.04 21:01:33.806,118.984,118.964,8.8,35.1 2003.05.04 21:01:51.362,118.986,118.966,76.1,38.1 2003.05.04 21:01:52.171,118.987,118.967(最大値、最後の数値),47.1,39.1 恐らく、同じ1分以内の年月日と時刻のデータが1個だけということはないと思いますがその場合、「最初の数値」、「最大値」、「最小値」、「最後の数値」は全て同じ数値となります。 そして、出力する際、次のような形式にします。 「西暦4桁」、「.」、「月2桁」、「.」、「日にち2桁」、「,」、「時間2桁」、「:」、「分2桁」、「,」、「最初の数値」、「,」、「最大値」、「,」、「最小値」、「,」、「最後の数値」、「1分間のデータの個数」 「2003.05.04 21:01」であれば、編集結果は次のようになります。 2003.05.04,21:01,118.961,118.967,118.958,118.967,5 これを1分間隔で時系列に沿って1行目から、 2003.05.04,21:01~ 2003.05.04,21:02~ 2003.05.04,21:03~ ~ のようにします。 変数を使うのであれば、各変数名を次のようにしてもらいたいです。 「最初の数値」を、Open、 「最大値」を、High、 「最小値」を、Low、 「最後の数値」を、Close、 「1分間のデータの個数」を、Volume ■3. ダイアログで開くように指定し、保存先を決め、編集したデータが入ったテキストファイルが自動的に作成され、保存できるようにします。 ファイル名は、 「元のCSVファイルの左から6文字目まで」、「_」、「最初のデータの西暦4桁」、「.」、「最初のデータの月2桁」、「.」、「最初のデータの日にち2桁」、「.」、「最初のデータの時間4桁」(「:」を除いた時間と分)、「-」、「最後のデータの西暦4桁」、「.」、「最後のデータの月2桁」、「.」、「最後のデータの日にち2桁」、「.」、「最後のデータの時間4桁」(「:」を除いた時間と分) と自動的にファイル名が付けられるようにしてもらいたいです。 例えば、次のような感じです。 ******_2003.05.04.2100-2003.05.30.1459 少し調べたのですが、CSVファイルを開くプログラムは分かったのですが、それ以降のテキストファイルで開き、データを取得などは分かりませんでした。 自分が不勉強で申し訳ないのですが、可能であればこれらのVBAによるプログラムを教えてください。 回答よろしくお願いします。