 |
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
| 上一篇主題 :: 下一篇主題 |
| 發表人 |
內容 |
MyFox
註冊時間: 2008-03-04 文章: 13
第 1 樓
|
發表於: 星期一 六月 23, 2008 3:20 pm 文章主題: 如何拿掉CSV討厭的雙引號><? |
|
|
今天找很久只找到 Delimiter WithWITH Character ','
可以去掉我cursor的然後COPY TO CSV會出現的欄位抬頭,
但是我想要拿掉"ABCD","1234" 雙引號變成 ABCD,1234
請問要如何做到><? |
|
| 回頂端 |
|
 |
syntech
註冊時間: 2003-05-16 文章: 4255 來自: Taipei,Taiwan
第 2 樓
|
發表於: 星期一 六月 23, 2008 4:05 pm 文章主題: |
|
|
CHRTRAN( ) /CHRTRANC( )
你準備"寧可錯殺一百,不可放過一人"? _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
| 回頂端 |
|
 |
MyFox
註冊時間: 2008-03-04 文章: 13
第 3 樓
|
發表於: 星期一 六月 23, 2008 8:28 pm 文章主題: |
|
|
| syntech 寫到: | CHRTRAN( ) /CHRTRANC( )
你準備"寧可錯殺一百,不可放過一人"? |
我看不太懂耶? 可以給我一點範例嗎?
另外大大你那句話是不是怕說,我的資料中如果有" 如果全部取代會~蓋錯~
這個不怕我打算先把" 換成不可視字元,在取代成空白,但陷在就是卡在
不知道怎麼把COPY TO CSV後的雙引號拿掉><" |
|
| 回頂端 |
|
 |
syntech
註冊時間: 2003-05-16 文章: 4255 來自: Taipei,Taiwan
第 4 樓
|
發表於: 星期二 六月 24, 2008 10:31 am 文章主題: |
|
|
加油~~ _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
| 回頂端 |
|
 |
215001
註冊時間: 2003-06-11 文章: 393
第 5 樓
|
發表於: 星期二 六月 24, 2008 2:03 pm 文章主題: |
|
|
大概這樣子吧
copy to test.csv .....
str=FileToStr("test.csv") && 讀入字串.以便處理
str=StrTran(str,chr(34),'') && 開始轉換, 注意是 2 個單引號
strtofile(str,"test.csv") && 回存檔案 |
|
| 回頂端 |
|
 |
Watermelon
註冊時間: 2005-01-22 文章: 204
第 6 樓
|
發表於: 星期五 六月 27, 2008 2:10 pm 文章主題: |
|
|
| copy to c:\aaa.csv sdf 這樣好像是OK! |
|
| 回頂端 |
|
 |
syntech
註冊時間: 2003-05-16 文章: 4255 來自: Taipei,Taiwan
第 7 樓
|
發表於: 星期三 十一月 12, 2025 12:34 am 文章主題: |
|
|
最近問 copilot 的
"你是一個 VISUAL FOXPRO 9 的程式設計師, 你要撰寫一個函式 輸入參數為 VFP CURSOR 輸出為符合RFC 4180規範的 CSV 文件 並符合以下要求 1.第一行為欄位名稱" :
| 代碼: |
FUNCTION CursorToCsvString(tcCursorName)
LOCAL lcCsv, lcLine, lnFields, i, lcField, lcValue
lcCsv = ""
IF NOT USED(tcCursorName)
RETURN ""
ENDIF
SELECT (tcCursorName)
lnFields = FCOUNT()
*-- 產生欄位名稱列
lcLine = ""
FOR i = 1 TO lnFields
lcField = FIELD(i)
lcLine = lcLine + lcField
IF i < lnFields
lcLine = lcLine + ","
ENDIF
ENDFOR
lcCsv = lcLine + CHR(13) + CHR(10)
*-- 產生資料列
SCAN
lcLine = ""
FOR i = 1 TO lnFields
lcValue = ALLTRIM(TRANSFORM(EVALUATE(FIELD(i))))
*-- 處理特殊字元:逗號、雙引號、換行
IF '"' $ lcValue
lcValue = STRTRAN(lcValue, '"', '""')
ENDIF
IF "," $ lcValue OR CHR(13) $ lcValue OR CHR(10) $ lcValue OR '"' $ lcValue
lcValue = '"' + lcValue + '"'
ENDIF
lcLine = lcLine + lcValue
IF i < lnFields
lcLine = lcLine + ","
ENDIF
ENDFOR
lcCsv = lcCsv + lcLine + CHR(13) + CHR(10)
ENDSCAN
RETURN lcCsv
ENDFUNC
|
vfp的csv 現在逐漸變成一種特例
大多數的網頁開發工具接受的是:
| 代碼: |
CUS_NO,CUS_TYPE,CUS_NAME_1
1101,1,KYOSEKI
1102,1,SUMIPUTE
1103,1,DIGITAL
|
可以測試以下命令的差異 (vfp9.0):
| 代碼: |
COPY TO d:\cus_csv.csv TYPE CSV
COPY TO d:\cus_csv2.csv TYPE sdf
COPY TO d:\cus_csv3.csv Delimiter WithWITH Character ','
|
底下的 e.f 似乎很多工具沒照規範的,
都是要求不能換行,不能有單引號或雙引號
b.的話,有些公司會要求加入結尾字串,例如最後一行是"EOF"三個字元,
-------
https://data.gov.tw/faqs/630
RFC4180格式
分類 資料品質提升機制說明文件
a.
每一行都以 CRLF(\r\n or %x0D %x0A) 為結尾,但現在大部份的 implementation 都允許只用LF當結尾。
aaa,bbb,ccc CRLF
zzz,yyy,xxx CRLF
b.
最後一行可以不用結尾字元。
aaa,bbb,ccc CRLF
zzz,yyy,xxx
c.
每一行都需以「半形逗點」做分隔,每一行的欄位數量都需一樣。逗點間的空白也是欄位內容的一部份。每行的最後一欄不需有分隔逗點。
aaa,bbb,ccc
d.
每一欄(column field) 都可以用雙引號字元括起來,如果欄位內要出現雙引號字元,那麼一定要用雙引號括住內容,需注意的是,用來刮住欄位值的雙引號字元需緊跟在逗點之後出現,也就是說雙引號和逗點之間不能有空格,否則解譯器會把這欄位當成沒有雙引號括住的欄位值,但內容出現雙引號字元違反了規範,造成格式錯誤。MS-Excel 嚴格遵守這個規範,但 Libre Office 就容許這個空白的出現。
“aaa”,“bbb”,“ccc” CRLF
zzz,yyy,xxx
e.
欄位值內可以出現換行字元(CR, LF, or CRLF),此時欄位值需以雙引號括住。
“aaa”,“b CRLF
bb”,“ccc” CRLF
zzz,yyy,xxx
f.
如果欄位值內出現雙引號,那麼這個欄位值需以雙引號括住,且欄位內的雙引號字元前面要多加一個雙引號。
“aaa”,“b”“bb”,“ccc”
工具
Online validation tool :http://www.parse2.com/example-csv-RFC4180.shtml、http://csvlint.io/
Offline validation tool:https://github.com/Clever/csvlint
PHP lib:https://github.com/parsecsv/parsecsv-for-php
參考
https://tools.ietf.org/html/rfc4180
http://www.parse2.com/example-csv-RFC4180.shtml
https://github.com/Clever/csvlint _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
| 回頂端 |
|
 |
syntech
註冊時間: 2003-05-16 文章: 4255 來自: Taipei,Taiwan
第 8 樓
|
發表於: 星期三 十一月 12, 2025 12:54 am 文章主題: |
|
|
另外有些會要求 UTF-8 編碼
有些會要求檔頭加入BOM識別是 UTF-8
大概這樣做就可以
| 代碼: |
lcBOM = CHR(239) + CHR(187) + CHR(191) && UTF-8 BOM
lcUtf8 = STRCONV(lcCsv, 9) && 9 = UTF-8
RETURN lcBOM + lcUtf8
|
不過有些網頁開發工具會把BOM與接續的字元組合成一個新字,
造成標題(field header)錯誤.
請先確認 _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
| 回頂端 |
|
 |
CPS0204
註冊時間: 2014-08-24 文章: 483
第 9 樓
|
發表於: 星期三 十一月 12, 2025 6:53 pm 文章主題: |
|
|
chat gpt 回答:
可以!在 VFP 9 要「拿掉 CSV 的雙引號」有幾種做法,依你需求嚴格度選一招:
#1 產出時就盡量不要加引號
如果你現在用的是 `COPY TO ... TYPE CSV`,它會很愛加雙引號。改成 **一般分隔檔**會少很多引號(只有遇到真的需要時才加):
```xbase
* 字元集請換成你要的(950=繁中、1252=西歐…)
COPY TO out.txt TYPE DELIMITED WITH ',' WITH CHARACTERSET 950
```
> 注意:這仍可能在欄位含逗號、換行、引號時自動加上雙引號(為了維持 CSV 規範)。如果你「完全不要任何雙引號」,看 #2 或 #3。
#2 先用現有方式輸出,再整檔移除引號(簡單粗暴)
```xbase
lcIn = "out.csv"
lcOut = "out_noquote.csv"
STRTOFILE( ;
STRTRAN(FILETOSTR(lcIn), '"', ''), ;
lcOut )
```
> 風險:若資料本身含逗號/換行,去掉引號後,**欄位會錯位**。只有在你確定每個欄位都不會出現逗號、換行、雙引號時才安全。
#3 自訂輸出(最保險、可完全控制不產生引號)
自己寫檔並把可能壞格式的字元處理掉(例如把逗號換成空白或其他符號),確保**永不輸出雙引號**:
```xbase
* 範例:將資料表 curData 輸出成無雙引號、逗號分隔檔
* 將逗號(,)與雙引號(")移除,避免破壞結構
LOCAL lnH, lcFile, lcLine
lcFile = "out_clean.csv"
lnH = FCREATE(lcFile)
IF lnH < 0
MESSAGEBOX("無法建立輸出檔")
RETURN
ENDIF
* (可選) 寫表頭
lcLine = "ColA,ColB,ColC"
=FPUTS(lnH, lcLine)
SELECT curData
SCAN
* 轉字串 + 清理
lcA = CHRTRAN(TRANSFORM(curData.ColA), ',"', ' ') && 把逗號與雙引號變空白
lcB = CHRTRAN(TRANSFORM(curData.ColB), ',"', ' ')
lcC = CHRTRAN(TRANSFORM(curData.ColC), ',"', ' ')
* 若還可能有 CR/LF,順便去掉:
lcA = CHRTRAN(lcA, CHR(13)+CHR(10), " ")
lcB = CHRTRAN(lcB, CHR(13)+CHR(10), " ")
lcC = CHRTRAN(lcC, CHR(13)+CHR(10), " ")
lcLine = ALLTRIM(lcA) + "," + ALLTRIM(lcB) + "," + ALLTRIM(lcC)
=FPUTS(lnH, lcLine)
ENDSCAN
=FCLOSE(lnH)
```
> 好處:完全不會有雙引號;壞處:你要自己決定「遇到逗號/換行/引號」怎麼處理(直接刪除、改成空白、或改成其他分隔符號如 `|`)。
> 變體:乾脆用「TAB 分隔」更穩(多數 Excel 也能開):把上面逗號改成 `CHR(9)`,同時改掉清理策略。
---
## 快速建議
* **要給 Excel/別的系統吃,又怕壞格式**:用 #1(DELIMITED),讓 VFP 在必要時自動加引號,最省事也最安全。
* **你 100% 確定資料裡沒有逗號/換行**:用 #2 最快。
* **你要 0 個雙引號,且可接受改寫內容**:用 #3 自訂輸出(或改成 TAB/管線分隔)。
如果你貼一下你現在的 `COPY TO` 指令、欄位大致型態(有沒有逗號/換行),我可以直接幫你改成最合適的一行(或給你客製版的 #3 範例)。 |
|
| 回頂端 |
|
 |
syntech
註冊時間: 2003-05-16 文章: 4255 來自: Taipei,Taiwan
第 10 樓
|
發表於: 星期三 十一月 12, 2025 8:59 pm 文章主題: |
|
|
"符合RFC 4180規範的 CSV 文件"
"越精確的問題,會得到越精確的答案"
這就是目前使用AI的最佳方式
這也是我們這些老頭比菜鳥更佔優勢的原因 _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
| 回頂端 |
|
 |
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|