作者tropical72 (藍影)
看板C_and_CPP
標題[問題] 讀 csv 問題
時間Mon Dec 20 01:39:35 2010
開發平台(Platform): (Ex: VC++, Gcc, Linux, ...)
vs2008 + xp
餵入的資料(Input):
Name,Score1,Score2,Score3
"John",99,99,99
"Tom",100,100,
"Mary",,,
"Frank",50,,
程式碼(Code): (請善用置底文標色功能)
#define BUF_SIZE 2000
char *ptr=NULL;
char buffer[BUF_SIZE];
while(gets(buffer, BUF_SIZE)!=NULL){
ptr = strtok(buffer, ",");
while(ptr!=NULL){
// printf("%s\n", ptr);
ptr = strtok(NULL, ",");
}
}
補充說明(Supplement):
(1) strtok 限制
如上範例與原始檔,使用 strtok 時,
如果出現連續的分隔符號其實判斷不出來,
我想知道有沒有其它辦法可以判斷有些欄位是沒有填東西的。
(2) 其它 "想像" 中的方法
目前我想用 strchr 方式去做類似的事
ptr1 = strchr(buffer, ',');
ptr2 = strchr(ptr1+1, ',');
printf("%s\n", buffer);
while(ptr1!=NULL){
// printf("%s\n", ptr2-ptr1);
// 想做類似上面這行這種事,但不知該如何表示,
// 還是只能用 memcpy 方式先複製到另一 buffer,再印出來?
ptr1 = strchr(ptr1+1, ',');
if(ptr1!=NULL) ptr2 = strchr(ptr1+1, ',');
}
(3) 若 csv 裡面欄位還有雙引號+逗號(逗號必在雙引內)的話..
Name,Age,Comment
"John",18," "年輕" " ---> 第三欄有雙引
" "Mary" ",6, "太,小" ---> 第一欄有雙引,第三欄有逗號
" "Frank" ", 30, " ""年輕,力壯"" " ---> 第一欄一次雙引, 第三欄二次雙引+逗號
如果要去分出來的話,目前我想到的也只是逐字去讀 + stack 方式,
不知是否有人有更好的想法?不一定要是用 string.h 的東西
用 C++ 的 stringstream 也可以!!
以上,請各位先進不吝賜教,感激不盡!!
--
YouLoveMe() ? LetItBe() : LetMeFree();
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.76.142
※ 編輯: tropical72 來自: 180.177.76.142 (12/20 01:42)
推 Yshuan:寫lex吧 自己爆的話我可能嘗試畫PDMA 12/20 01:43
→ tropical72:嗯,便是lex問題,好奇是否大多lex都是逐字去讀? 12/20 01:46
→ loveme00835:stack 也不差阿 XD 12/20 02:05
→ tropical72:耶..我知道用stack這方法不差,只是覺得逐字去讀效率很 12/20 02:08
→ tropical72:差,所以才請教上面提到的csv特例問題,是不是要逐字去讀 12/20 02:09
→ tropical72:(如果是逐字讀的話,stack的確是較方便實做的我同意) 12/20 02:09
→ loveme00835:讀進 string 再一個個檢查並不慢吧? 12/20 02:11
→ tropical72:所以 love 大應也是覺得逐字去讀就可以了吧? 12/20 02:13
→ loveme00835:如果只是簡單的分辨 '"' 還有 ',', stack 就很夠了, 12/20 02:31
→ loveme00835:複雜下去沒好處, 而且我也快寫好了 XD 12/20 02:31
→ loveme00835:花時間在部署上, 也太不划算 0.0 12/20 02:44
→ tropical72:oh!! sorry!! 貼錯了 XD 12/20 02:57
推 loveme00835:@_@ ? 12/20 02:58
→ loveme00835:我沒有處理前後有空白的~ 你需要trim一下 12/20 03:01
→ tropical72:謝謝協助,我消化一下,感激不盡 12/20 03:02