.csv 換欄位問題 |
答題得分者是:aftcast
|
small7011
一般會員 發表:19 回覆:34 積分:10 註冊:2007-07-24 發送簡訊給我 |
|
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
不知您用何方式填值至 Excel. 只要會填 A1~A50, 應也會填 B1~B50, 為何不會換欄 ?
用兩層迴圈, 外層 nCol, 內層 nRow, 執行下列指令, 看是否為您要的結果: exlSht.OlePropertyGet("Cells",nRow,nCol).OlePropertySet("Value", 通常用兩層迴圈, 外層 nRow, 內層 nCol, 即每 Row 50 Col 為一 Record, 共 100 Row (Record). 不知您為何反而用 1 Col 為一 Record. 當然有特殊需求仍是可以的. ===================引 用 small7011 文 章=================== 我的問題是這樣的,我要存放的數值每次得到都是不固定的,是由側台提供,但是資料存放的順序是固定的 存放的動作為: 從A1~A50 然後換到B欄位的B1~B50 然後換到C欄位的C1~C50 以此類推到CV1 ~CV50,共100筆 意思就是資料每次進來都有50個,但是下一筆存放時就必須換欄位存放 我目前最大問題是不會換欄位,希望各位前輩可以教導我,謝謝. |
small7011
一般會員 發表:19 回覆:34 積分:10 註冊:2007-07-24 發送簡訊給我 |
感謝您的回覆,使用OLE的方式我試過,也可以達到我要的目的,我也是利用兩層洄圈,但是速度真的太慢,
因為我需要存100筆,每筆10320資料,資料龐大需要很久時間,還是有什麼可以提升OLE存檔速度的方式嗎? ===================引 用 herbert2 文 章=================== 不知您用何方式填值至 Excel. 只要會填 A1~A50, 應也會填 B1~B50, 為何不會換欄 ? 用兩層迴圈, 外層 nCol, 內層 nRow, 執行下列指令, 看是否為您要的結果: exlSht.OlePropertyGet("Cells",nRow,nCol).OlePropertySet("Value", 通常用兩層迴圈, 外層 nRow, 內層 nCol, 即每 Row 50 Col 為一 Record, 共 100 Row (Record). 不知您為何反而用 1 Col 為一 Record. 當然有特殊需求仍是可以的. ===================引 用 small7011 文 章=================== 我的問題是這樣的,我要存放的數值每次得到都是不固定的,是由側台提供,但是資料存放的順序是固定的 存放的動作為: 從A1~A50 然後換到B欄位的B1~B50 然後換到C欄位的C1~C50 以此類推到CV1 ~CV50,共100筆 意思就是資料每次進來都有50個,但是下一筆存放時就必須換欄位存放 我目前最大問題是不會換欄位,希望各位前輩可以教導我,謝謝.
------
lee |
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
存100筆,每筆10320資料, 確實量大, 速度與 PC CPU 及 Memory 有關,
在相同硬體條件下, 可能難有更快的方法. 若知道 Excel File Layout, 直接用 Binarry write 是可能最快的方式, 但好像無法取得這方面的詳細資料. 剛看到 "黑暗破壞神" 版主的文章: http://delphi.ktop.com.tw/board.php?cid=168&fid=916&tid=95882 若先將輸出存成文字檔或 .csv 檔, 再由 Excel 開檔轉成 .xls 檔, 可能會較快.
編輯記錄
herbert2 重新編輯於 2008-11-05 19:55:02, 註解 無‧
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
請改用2維陣列配合直接存csv的方式,類似上回我和你講的方式。
int (*a)[100] = new int[10320][100]; int gColum = 0; //每次一批來的時候,就改這個全域值 for (int i=0; i < 10320;i ) { a[i][gColum] = value; } fopen(......) //開檔 for (......) for (.....) printf (",%d", a[i][j]) delete [ ] a; 以上僅提示,細節靠你實作了! 亦可加以變化… 注意! 如果可以知道每一次來的資料的結構為何,也許可以再快一點。比如說是傳回一個int陣列,那就可以用陣列對拷的方式,無需一個一個的寫入陣列。 方便的話提供一下你的來源是什麼? 檔案? 還是傳回值? 若為檔,那又是何種檔? 若為傳回值,那又是哪一種型別? ===================引 用 small7011 文 章=================== 感謝您的回覆,使用OLE的方式我試過,也可以達到我要的目的,我也是利用兩層洄圈,但是速度真的太慢, 因為我需要存100筆,每筆10320資料,資料龐大需要很久時間,還是有什麼可以提升OLE存檔速度的方式嗎?
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
剛在你的另一個題目上看到你的來源是個陣列?! 是 int 陣列嗎? 若是,則把我上面的修改一下
宣告一個指標陣列 int *a[100] = new *int[100]; int gColum = 0; //每次一批來的時候,就改這個全域值 for (int i=0; i<100;i ) { a[i] = new int [10320]; } ::memcpy(a[gColum],f,10320); //f是你的int陣列來源 當 gColum到99時,表示資料都copy完成,於是 fp = fopen(......) //開檔準備存檔 for (int j=0; j<10320;j ) { fprintf("%d",a[0][j]); for (int i=1; i<100;i ) fprintf(",%d",a[i][j]); fputs("\n",fp) } fclose(fp) //關檔 for (int i=0; i<100;i ) { delete [ ] a[i]; } delete [ ] a; 與上篇不同的地方在於使用memcpy來copy,而不是用loop一個一個的copy,會快非常非常的多!
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
small7011
一般會員 發表:19 回覆:34 積分:10 註冊:2007-07-24 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
fprintf("%d",a[0][j]); //<--這行是因為第1行的資料是不能有逗號在前面
fputs("\n",fp) //這行是當每一列的最後一個元素被寫入後,就再它的後面加入換行符號 舉例csv的檔案格式如下: 1,2,3,4,22 6,7,8,9,10 你看第一行的1與6是不是沒有逗號? 而第2行到第5行是不是都要加逗號? 此外,到了22或10的時候,其實22的後面有個無形的換行符號,這就是fputs("\n",fp) 的原因! 注: 我上篇寫的程式碼,你可能無直接使用,還請你理解原理後參考我的即可。(搞不好i 與j 的順序我有錯,因為我沒很詳細的檢查喔!
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
small7011
一般會員 發表:19 回覆:34 積分:10 註冊:2007-07-24 發送簡訊給我 |
謝謝aftcase ,我了解你的意思之後,已經解決我的問題,真的很感謝,但是我想請教另一問題
memcpy(),是不是有大小限制,我的iRes使用10320沒有問題,但是20460就會出現錯誤 還是動態二維陣列不能這樣copy [code cpp] void __fastcall TfrmNumTime::Button1Click(TObject *Sender) { int iTime; iRes=StrToInt(cobRes->Text); iTime=StrToInt(edtNumTime->Text); FILE *cfPtr; float **array = new float *[iTime]; for (int k=0; k } for(int i=0;i CoreIO(i); ZeroMemory(array[i],(iRes 1)*sizeof(float)); memcpy(array[i],fW,(iRes 1)*sizeof(float)); } cfPtr = fopen("PixelData.csv","w"); for (int j=0; j fprintf(cfPtr,"%f",array[0][j]); for (int i=1; i } fputs("\n",cfPtr); } fclose(cfPtr); MessageBox(NULL,"Done","Mission",MB_OK); for (int k=0; k } delete [] array; }[/code]
------
lee
編輯記錄
small7011 重新編輯於 2008-11-11 13:41:06, 註解 無‧
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
|
small7011
一般會員 發表:19 回覆:34 積分:10 註冊:2007-07-24 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |