線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4145
推到 Plurk!
推到 Facebook!

.csv 換欄位問題

答題得分者是:aftcast
small7011
一般會員


發表:19
回覆:34
積分:10
註冊:2007-07-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-11-05 09:53:23 IP:211.20.xxx.xxx 訂閱
我的問題是這樣的,我要存放的數值每次得到都是不固定的,是由側台提供,但是資料存放的順序是固定的

存放的動作為:
從A1~A50 然後換到B欄位的B1~B50 然後換到C欄位的C1~C50 以此類推到CV1 ~CV50,共100筆

意思就是資料每次進來都有50個,但是下一筆存放時就必須換欄位存放


我目前最大問題是不會換欄位,希望各位前輩可以教導我,謝謝.
------
lee
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-11-05 16:26:31 IP:211.72.xxx.xxx 訂閱
不知您用何方式填值至 Excel. 只要會填 A1~A50, 應也會填 B1~B50, 為何不會換欄 ?

用兩層迴圈, 外層 nCol, 內層 nRow, 執行下列指令, 看是否為您要的結果:
exlSht.OlePropertyGet("Cells",nRow,nCol).OlePropertySet("Value",.c_str());

通常用兩層迴圈, 外層 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-11-05 17:36:57 IP:211.20.xxx.xxx 訂閱
感謝您的回覆,使用OLE的方式我試過,也可以達到我要的目的,我也是利用兩層洄圈,但是速度真的太慢,
因為我需要存100筆,每筆10320資料,資料龐大需要很久時間,還是有什麼可以提升OLE存檔速度的方式嗎?

===================引 用 herbert2 文 章===================
不知您用何方式填值至 Excel. 只要會填 A1~A50, 應也會填 B1~B50, 為何不會換欄 ?

用兩層迴圈, 外層 nCol, 內層 nRow, 執行下列指令, 看是否為您要的結果:
exlSht.OlePropertyGet("Cells",nRow,nCol).OlePropertySet("Value",.c_str());

通常用兩層迴圈, 外層 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-11-05 19:42:36 IP:211.72.xxx.xxx 訂閱
存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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-11-06 09:10:11 IP:59.115.xxx.xxx 訂閱
請改用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 重新編輯於 2008-11-06 09:19:03, 註解 無‧
aftcast 重新編輯於 2008-11-06 09:28:34, 註解 無‧
aftcast 重新編輯於 2008-11-06 09:34:36, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-11-07 19:21:21 IP:60.248.xxx.xxx 訂閱
剛在你的另一個題目上看到你的來源是個陣列?!  是 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
編輯記錄
aftcast 重新編輯於 2008-11-07 19:24:51, 註解 無‧
aftcast 重新編輯於 2008-11-07 19:50:27, 註解 無‧
small7011
一般會員


發表:19
回覆:34
積分:10
註冊:2007-07-24

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-11-10 14:55:37 IP:211.20.xxx.xxx 訂閱
有幾行指令我不是很懂意思,可以替我解答嗎?
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) //關檔

------
lee
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-11-11 07:11:06 IP:59.112.xxx.xxx 訂閱
 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-11-11 11:07:53 IP:211.20.xxx.xxx 訂閱
謝謝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 array[k] = new float[iRes 1];
}

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 fprintf(cfPtr,",%f",array[i][j]);
}
fputs("\n",cfPtr);
}
fclose(cfPtr);

MessageBox(NULL,"Done","Mission",MB_OK);
for (int k=0; k delete [] array[k];
}
delete [] array;
}
[/code]
------
lee
編輯記錄
small7011 重新編輯於 2008-11-11 13:41:06, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-11-15 15:44:41 IP:59.115.xxx.xxx 訂閱
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2008-11-15 15:59:15, 註解 無‧
aftcast 重新編輯於 2008-11-15 16:13:17, 註解 無‧
small7011
一般會員


發表:19
回覆:34
積分:10
註冊:2007-07-24

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-11-17 09:40:28 IP:211.20.xxx.xxx 訂閱
aftcast大,我知道我的問題在哪邊了,謝囉
===================引 用 aftcast 文 章===================
------
lee
系統時間:2024-04-25 6:23:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!