• ベストアンサー

1行ずつではなくまとめてファイル出力したいのですが

zwiの回答

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

複数行のcsvファイルを作りたいって認識でよいですか? 遅くなっているのは、ファイルのオープンクローズを繰り返しているからだと思います。 次のような手順でやれば早くなるはずです。 (1)ファイルオープン (2)forループ (3)計算 (4)file出力 (5)forループの終わり (6)ファイルクローズ 一度ソースを見せてもらえると的確に答えられるのですが。

tekcycle
質問者

お礼

ありがとうございます。 補足の方が長く懸けるようですので補足に書いておきました。 よろしくお願いいたします。

tekcycle
質問者

補足

#include "stdafx.h" #include <iostream> #include <fstream> #include <sstream> #include <string> #include <time.h> using namespace std; ~~各種グローバル変数の設定(大概グローバルにしています)~~ ~~各種関数の宣言(今のところ7つくらい)~~ ~~.csvファイルを読み込むためのクラスの宣言~~ void main(int argc,int *argv){ ~~コマンドライン引数の処理と時刻表示~~ ~~各パラメーターの値がそれぞれいくつのときは何番目の処理なのかを設定する~~ iは順番、array_parameter1[i],array_parameter2[i],array_parameter3[i],... ~~データファイル(.csv)を複数読み込む~~ ~~上で決めた順に計算開始~~ for (i=1;i<=10000;i++){ //ここでは1と10000ですが、これはそれぞれコマンドライン引数にするつもりです。 //array_parameter1[i]、array_parameter2[i]等を使って計算させる。 calculate() ; //関数に飛んで処理。Value1、Value2、Value3....などを得る。ただしグローバル変数。 ~~ここからが懸案なのですが...~~ ostringstream filetemp ; filetemp << array_parameter1[i] << "," << array_parameter2[i] << "," << array_parameter3[i] << "," << Value1 << "," << Value2 << "," << Value3 << "," << i <<"\n" ; string str=filetemp.str() ; if (ii%3000==0){ ofstream file1("c:\\datawax2.csv",ios_base::app |ios_base::out) ; file1 << str ; } ~~書き出すか別の変数に収めたらValue1、Value2、Value3は初期状態に戻しておく~~ } //for文終わり ~~後は時刻表示や毎時何回転したか、等のどうでも良い表示と、まだ書きだしてない物を最後に吐き出して終わり。~~ return ; } void calculate(){ ~~後略~~ の様な感じなんですが。これでよろしいでしょうか? ostringstreamでどうにか溜められないかと思ったのですが(それも無理なようですが)、お話からするとofstreamを使っている時点で無理なようですね。 すると、fopenしてfprintfでfcloseでしょうか? 教材は、c++よりもcなんでしょうか?c++だと、クラスだのストリームだのMFCだのがいっぱい書かれている割にこういう事が書かれていない物が多そうなのですが。 なお、最初にfopenして、プログラム終了までfcloseしないものは、運用上拙いのかもしれません。 丸一日丸何日動かすので、度々クローズしてくれるとctrl+cでプログラム自体停止できて、その時途中までの結果が残せると思うのですが。 クローズしない場合、途中で停止させた場合、どこまで残るんでしょう。 半端な行があっても停止の数行前まで大体残ってくれるなら(そしてファイルが壊れていないなら)最初にfopenして最後にfcloseでも良いのですが。 この辺りどうなのでしょうか? よく判らないまま手元の本をアレンジすると、 void print_out(void){ FILE *fp int array_output[3100][12] ; if ((fp=fopen("c:\\kekka.csv","a"))==NULL){ printf("ファイルが開けません\n") ; exot(1) ; } for (int i2=i-3000+1 ; i2<=i ; i2++){ int fprintf (fp,"%s,%s,%s,.....\n",array_output[i2][1],array_output[i2][2],array_output[i2][3],.....) } fclose(fp) ; } こんな感じでどうなのでしょうか? よろしくお願いいたします。

関連するQ&A

  • ファイルの3行目までを出力したい

    Perl初心者です。 test.txtというファイルがあって、その中の1行目から3行目までを 出力したい場合はどうしたらいいでしょうか? open(FILE,"test.txt") || die "Open Error.\n"; @data = <FILE>; close(FILE); foreach (@data) { print $_; } これだと、ファイルの中身が全て出力されてしまいます。

    • ベストアンサー
    • Perl
  • CSVの出力(1行を3行に出力~)

    テキスト式1行 200705 00001 A01 A02 B01 B02 C01 C02があるとします。 200705と00001は3行の先頭を出したいので、どうやってループさせたらいいのかわからないのです。 今の状況 Private Sub Object(lFname As String, lOFilename As String) Dim IUO As Variant ''出力データ Dim lFBnt As Long ''開始位置1 Dim m_Input As String ''レコード退避先データ Dim byteInput() As Byte ''領域確保変数 Dim fs As Object ''ファイルシステムオブジェクト Dim ObjOutFile As Object ''出力先ファイルオブジェクト'' IUO = "" ''出力先ファイルオブジェクトの作成 Set fs = CreateObject("Scripting.FileSystemObject") ''出力先ファイル名の指定 Set ObjOutFile = fs.CreateTextFile(lOFilename, True) ReDim byteInput(レコードの長さ- 1) ''正常ファイル時のファイルオープン Open lFname For Binary As #1 '' ファイルの終端までループを繰り返します。 Do While Loc(1) < LOF(1) IUO= "" ''該当行のレコードデータの取得 Get #1, , byteInput m_Input = StrConv(byteInput, vbUnicode) lFBnt = 1 IUO = IUO + Chr(39) & MidMbcs(m_InputBuffer, lFBnt, 一つ目のパラメータ名) + Chr(39) lFBnt = lFBnt + 一つ目のパラメータ名 IUO = IUO + vbNewLine ''改行 ''ファイルへの書込 ObjOutFile.Write (IUO) Me.Refresh Loop Close #1 ''File close ObjOutFile.Close Set ObjOutFile = Nothing End Sub 以上では1行しか出力できないのですが、どうやったら3行出力できるのでしょうか。 よろしくおねがいします。

  • c++ 出力ファイル名

    c++ 初心者 です。fortran 77fortran 90でしたら幾分わかります。 c++ のプログラムで、for 文やwhile文の中に出力させる文章を置いて、出力されるファイル名をforやwhileの変数に関連ずけるには、どういったものを書けばよいでしょうか? たとえば、以下のようなプログラムを書いて実行すると、"test"という文が書かれた"1"というファイル名のファイルが出力されます。 / / / / / / / / / / / / / / / / / / / #include <iostream> #include <fstream> using namespace std; int main() { ofstream of; of.open("1", ios::app); of << "test" << endl; of.close(); return 0; } / / / / / / / / / / / / / / / / / / / 上のプログラムの中の出力ファイル名は"1"ですが、これをfor文等のループの中で"1"~"10"として10個のファイルを出力したいです。 以下のように書くと、"i"というファイルに"test"という文字が10個書き込まれます。 / / / / / / / / / / / / / / / / / / / #include <iostream> #include <fstream> using namespace std; int main() { int i; ofstream of;   for(i=0; i<=10; i++) {     of.open("i", ios::app);     of << "test" << endl;     of.close(); } return 0; } / / / / / / / / / / / / / / / / / / / 上のプログラムの中の"i"のクオーテーションマーク""をとって of.open(i, ios::app); のように書いたらエラーでコンパイルできません。また、 of.open((char*) i, ios::app); のように書くとコンパイルはできますが、ファイルができません。 ファイル名"1"に"test" ファイル名"2"に"test" ファイル名"3"に"test" ・ ・ ・ ファイル名"10に"test" という風に出力できればいいのですが... わかる方すみませんが、ご指導願います

  • ofstreamのパラメータについて

    こんにちは。 よろしくお願いいたします。 次の様なソースで、ofstreamで定義した「OutFile」をオープンし、 オープン出来たかどうかを、次のif文で見ています。 ofstreamで定義した「OutFile」は色々なパラメータを含んでいますが、このif文で見ているのは、「OutFile」のどこのパラメータでしょうか? ofstream OutFile; AnsiString asBuff; asBuff = "C:\\aaa.tmp"; OutFile.open( asBuff.c_str() ); if( !OutFile ){ ShowMessage("エラー"); }

  • ファイル出力について

    「test1」というファイルの最後の3行を「test2」というファイルに出力する。 というプラグラムはどのように組み立てればいいのでしょうか? (test1) 1行目の文 2行目の文 3行目の文 4行目の文 5行目の文 6行目の文 ↓ (test2) 4行目の文 5行目の文 6行目の文

  • ファイル出力ついて

    当方、JAVA初心者です。 CSVファイルの出力を行うプログラムを作成しています。 仕様として1行目はヘッダ部分を出力し、 2行目以降にDBの値を出力するCSVファイルを作成しようとしています。 例 (ヘッダ部分)"項目A----","項目B----","項目C----","項目D----" (データ部分)"項目Aの値","項目Bの値","項目Cの値","項目Dの値"             ・             ・ ですが、データ部分の個数が不変になっており、ヘッダ部分がずれてしまいます。 例 項目Cの数が2個ある場合はデータ部分に項目Cの値を2個出力する為、 項目Dのヘッダ部の列の下に項目Cの2個目の値が書き込まれてしまいます。 "項目A----","項目B----","項目C-----","項目D-----" "項目Aの値","項目Bの値","項目Cの値1","項目Cの値2","項目Dの値"             ・             ・ そこで、先にデータ部分の書き込みを行い、それぞれの項目のデータ件数の最大値を保持し、最後にデータ件数の最大値に合わせてヘッダ部分の書き込みを行おうと考えているのですが、 ファイルをopenしなおす方法以外で、 先に2行目以降の書き込みを行い、最後に1行目の書き込みを行う方法がわからなく困っております。 ご回答のほど、宜しくお願いします。

    • ベストアンサー
    • Java
  • <Perl>参照配列の出力に失敗する。

    <Perl>参照配列の出力に失敗する。 お世話になります。 配列の出力部で以下のエラーが出力されます。 Use of uninitialized value in print at test2.pl line 12. -----コーディングは以下の通りです。----- #!C:\perl use strict; use warnings; my @l = (); #----------- #GetDataへCSVファイル名と、格納用配列を渡す #----------- my $cnt = &GetData("test.csv", \@l); print "COUNT -> ".$cnt; for(my $i=0; $i < $cnt; $i++){ print $l[$i]; } ################################################################## # 概   要:指定したCSVファイルをオープンしCSVデータを配列に取得する。 # パラメータ:ファイル名, CSVデータ格納用配列 # 戻 り 値:データ取得件数 ################################################################## sub GetData { my ($f, @bf) = @_; my $rcnt = 0; print "FILE NAME -> ".$f."\n"; if ( open(FP, "<${f}") ){ print "FILE OPEN -> success.\n"; @bf = split(/,/, <FP>); close(FP); $rcnt = @bf; print "CSV GET COUNT -> ".$rcnt."\n"; } return $rcnt; } -----実行結果は以下の通りです。----- D:\>perl test.pl FILE NAME -> test.csv FILE OPEN -> success. CSV GET COUNT -> 5 Use of uninitialized value in print at test2.pl line 12. Use of uninitialized value in print at test2.pl line 12. Use of uninitialized value in print at test2.pl line 12. Use of uninitialized value in print at test2.pl line 12. COUNT -> 5 -----CSVファイルの内容は以下の通りです。(ファイル名:test.csv)----- あいうえお,かきくけこ,さしすせそ,たちつてと,なにぬねの 配列の要素数が取れているので、配列内にデータは格納されているとは思っています。 出力方法をどのように正せばよいがご教示お願い致します。

    • ベストアンサー
    • Perl
  • E型の出力について

    お世話になります。 Fortran90にてファイル出力する際、数値データをE型で出力します。 この時、値がゼロに非常に近いデータが「0.1820639214-253」のように出力されてしまいます。 何が問題なのか、教えてください。 ちなみに出力文は以下のような感じです。 open(10,FILE = DATA.dat,form='formatted') write(10,'(10E20.10)')((F(i,j),j=1,Nz),i=1,Nx) close(10)

  • print_rで出力した配列データファイルをfile_get_cont

    print_rで出力した配列データファイルをfile_get_contentsでそのまま取り込もうとしましたが、配列としてではなく文字列として取り込んでしまいます。 ひとつの配列にまとまってしまします。 text.php $data=array(1,2,3,4,5); print_r($data); Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) output.php これを別ファイルで取り込むと$value= file_get_contents("text.php"); echo $value; print_r($value);両方とも Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) が出力されました。 配列として取り込みたいのですが可能でしょうか?

    • ベストアンサー
    • PHP
  • 2つのエクセルから同じデータを持つ行を出力する方法

    エクセルで作成した二つのDBがあります。それぞれ、列・行の数は異なるのですが、同じ名称の列(例えば郵便番号)を持っています。 この二つのファイルから、同じ列に同じ情報をもった行を取りだす、ということをしたいのですが、関数やマクロでの実現できる方法がございましたら、教えて頂けないでしょうか。 例:二つの住所録のようなファイルAとファイルBがあって、郵便番号が154-0001のデータ(行)を、別のファイルCに出力する。(また、ファイルC上では、各データがファイルAとファイルBのどちらから出力されたものかも、判別が付くように出力したい) 分かりにくいケースで大変恐縮ですが、ご存じの方がおりましたら、どうぞよろしくお願いいたします。 ※エクセル2003を使用しています。