VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

如何拿掉CSV討厭的雙引號><?

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
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. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
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. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
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. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
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. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
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. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作