2017-03-02 30 views
0

因此,我正在循環數據文件,以便根據每個數據文件進行計算(計算每個文件20個分檔,因此每個文件有20個結果)。然後我想把每個計算都放到一個csv文件中,這樣我就可以對每個文件的計算進行平均。C++:如何將CSV數據輸出到現有文件中特定的一組單元格中?

每次我遍歷一個文件時,我正在獲取一個csv文件,其中包含20個單元格A1到A20的結果。

但是,我想要的是在單元格A1到A20中有20個結果的csv文件,單元格B1到B20等中的另外20個結果等等,最多20個單元格導致單元格CV1到CV20。

我在每個循環的代碼看起來像這樣的輸出數據:

ofstream ofs (path2 + "tanShears.csv", ofstream::out); 
for (int j = 0; j < r.size(); j++) { 
    ofs << tShears[j] << endl; 

很顯然,我做這個,我只是20個結果在單元格A1落得A20對應的最終數據在迴路設置時,因爲每個循環只覆蓋前一個循環。

任何想法如何我可以在csv文件中定位特定的單元格,以便我可以將每個循環的結果輸出到同一個csv文件的不同部分?

+0

在整個文件中讀入矢量矢量,更改需要更改的部分,並將整個文件寫回。 –

+0

或者,不要始終關閉並重新打開輸出文件。在外循環開始時打開一次,迭代所有數據文件,然後關閉它。 – mars

+0

不要每次打開ofstream,打開它一次並連續寫入它 – BartekPL

回答

0

您可以將結果保留在一個向量中(一個接一個20的塊,或使用不同的向量)。

然後一次寫入所有數據。 csv中第一行上的每個塊的第一個值,然後是第二個值,依此類推。

0

檢查:http://www.cplusplus.com/reference/fstream/ofstream/ofstream/#parameters

你應該寫某事像這樣:

ofstream ofs (path2 + "tanShears.csv", ofstream::out|ofstream::app); 

可以存儲在矢量所有的結果,但如果計算是一個長期的過程(它需要一個小時),有是否有可能丟失這些數據(何時出錯),在這種情況下,更好的辦法是在計算每部分後將結果寫入文件。

但是,寫入文件全部數據似乎比許多寫入部分數據更快。

0

我理解你的問題嗎?
您有20個數據源,包含csv數據,每個數據源20個。您需要使用這些數據進行操作,稍後將每個數據集寫入文件?

#include <map> 
#include <vector> 
#include <string> 

struct privateData { 
    map<string,vector<vector<string>>> allData; 
    void addDataUnit(const string& block, const vector<string>& unit) 
    { 
    // I consider that you already parsed csv data into separated elements 
    allData[block].push_back(unit); 
    } 
    string getDataRow(const string& block, int position) { 
    string ret; 
    if (allData[block].size() >= position) return ret; 
    for (unsigned int i = 0; i < allData[block][position].size(); i++) { 
     ret+=allData[block][position][i]; 
     ret+="SomeDelim"; 
    } 
    return ret; 
    } 
    vector<string> getDataBlock(const string& block) { 
    vector<string> ret; 
    for (unsigned int i = 0; i < allData[block].size(); i++) 
     ret.push_back(getDataRow(block,i)); 
    return ret; 
    } 

} 

我沒有編譯 - 所以,可能是一些語法錯誤。
因此,每個dataBlock將被命名爲一個單元集的數組。 然後,您可以迭代地圖以獲取所有名稱並將其寫入單獨的文件或單獨的數據集。
希望它可以幫助

1

一個CSV文件的結構是這樣的:

[A1];[B1];[C1];...\n 
[A2];[B2];...\n 
[A3];[B3];...\n 

如果你不想馬上寫全的數據,你將不得不讀取整個文件,分析它,相應地做出改變,然後寫下來。幾乎不惜任何代價我會避免這種情況。

我們一些示例代碼:(我假設要打印一些int值)

void writeToCSV(std::vector<std::vector<int>> const& tShears) 
{ 
    ofstream ofs (path2 + "tanShears.csv", ofstream::out); 
    for (std::vector<std::vector<int>>::iterator j = tShears.begin(); 
     j != tShears.end(); j++) 
    { 
     for(std::vector<int>::iterator i = j->begin(); i < j->end(); j++) 
     { 
      ofs << i << ";"; 
     } 
     ofs << std::endl; 
    } 
    ofs.close(); 
} 

在本例中的內載體包含已進行了所有計算的第n個值。所以它可能包含A1,B1,C1 ...

+0

確定這看起來不錯。那麼我會 - 在我的數據文件循環中 - 只需包含函數「writeToCSV(tShears);」 (tShears是我在每個循環中得到的最後20個元素的向量)??在我的例子中, – crazycrazy

+0

tShears是一個包含整數值向量的向量。您應該只在您的Loop中使用該數據文件中的矢量。完成循環後,您可以調用writeToCSV函數。 – FloIsAwsm

相關問題