PHP fputcsv/fgetcsv ã® $escape ãªãã·ã§ã³
fputcsv 㨠fgetcsv ã«ã¯ $escape ãªãã·ã§ã³ãããã¾ãã
ï¼fputcsv ã®ããã¥ã¢ã«ãæ´æ°ããã¦ãã¾ããããPHP 5.5.4 㧠$escape ãªãã·ã§ã³ã追å ããã¦ãã¾ããï¼
ãã®åä½ãåéããã¦ããã®ã§ãã¡ãã£ã¨æ´çãã¦ããã¾ãã
åæ
ä»¥ä¸ fputcsv/fgetcsv ã¨ãã«ããã©ã«ãã®
- $delimiter = ","
- $enclosure = '"'
ã¨ãã¦å¼ã³åºããåæã§æ¸ãã¾ããï¼èª¬ææä¸ã§ $delimiter ã¨ã $enclosure ã¨ãæ¸ãã¦ãèªã¿ã¥ããã¨æãã®ã§ãï¼
åä½ã¯ PHP 5.6.0 ã§ãã½ã¼ã¹ã¯ 現時点の master 最新版 ã確èªãã¾ããã
æå¾ ããåä½ï¼åéãï¼
æå¾ ããåä½ã¯ã
- fputcsv ã $escape = "\\"ï¼ããã©ã«ãï¼ã§å¼ã³åºããå ´åãã"ãã¯ã\"ãã¨ãã¦ãã\ãã¯ã\\ãã¨ãã¦åºåããã
- fgetcsv ã $escape = "\\"ï¼ããã©ã«ãï¼ã§å¼ã³åºããå ´åãã\"ãã¯ã"ãã¨ãã¦ãã\\ãã¯ã\ãã¨ãã¦èªã¿è¾¼ã¾ãã
ã¨ãããã®ã§ãããªã®ã§ãRFC 4180 ã®ä»æ§ã Excel ã®åä½ã«åããããªãã°ãfgetcsv/fputcsv ã®å¼ã³åºãæã« $escape = '"' ãæå®ãã¦
- fputcsv æã«ã"ããã""ãã¨ãã¦åºåãã
- fgetcsv æã«ã""ããã"ãã¨ãã¦èªã¿è¾¼ã
å¿ è¦ãããã»ã»ã»ã®ã ã¨æã£ã¦ãã¾ããã
å®éã®åä½
å®éã®åä½ã¯ fputcsv/fgetcsv ã¨ãã«ã$escape ã®æå®ã¨ã¯é¢ä¿ãªã
- fputcsv æã«ã"ããã""ãã¨ãã¦åºåãã
- fgetcsv æã«ã""ããã"ãã¨ãã¦èªã¿è¾¼ã
ã®å¦çãå ¥ã£ã¦ãã¾ãã
ã§ã¯ $escape = "\\" ã®åä½ã¯ã©ããããã®ãã¨ããã¨ã以ä¸ã®ãããªåä½ã«ãªã£ã¦ãã模æ§ã§ãã
- fputcsv ã® $escape ã¯ãfputcsv ã«æ¸¡ãããæååä¸ã®ã"ãããã®æåã§ã¨ã¹ã±ã¼ãæ¸ã¿ã§ãããã¨ã示ã
- ã"ãã¯é常ã""ãã¨ãã¦åºåãããããã\"ãã®å ´åã¯ã\""ãã¨ããã\"ãã¨ãã¦ãã®ã¾ã¾åºåããã
- fgetcsv ã® $escape ã¯ããã®æåã§ã¨ã¹ã±ã¼ãããã¦ããå ´åã¯ãã£ã¼ã«ãçµç«¯ã®ã"ãã¨ã¿ãªããªãããæ示ãã
- ã"ab\",cd"ããèªã¿è¾¼ãã å ´åã«ãab\"ããcd"ãã¨ãã¦èªã¿è¾¼ãã®ã§ã¯ãªããab\",cdãã¨ãã¦èªã¿è¾¼ã
- ã¨ã¹ã±ã¼ãã解é¤ãã¦ãab",cdãã¨ãã¦ãããããã§ã¯ãªãç¹ã«æ³¨æ
ä¸è¨ã®åä½ãªã®ã§ãããã"ããã\"ãã«ã¨ã¹ã±ã¼ãããä»æ§ã§ CSV ãä½æããããã°ã
- ãããããã"ããã\"ãã«ç½®æããä¸ã§ãfputcsv ã $escape = "\\" ã§å¼ã³åºã
- fgetcsv ã $escape = "\\" ã¨ãã¦å¼ã³åºããä¸ã§ãã\"ããã"ãã«ç½®æãã
å¿ è¦ãããã¾ãã
ã¾ããRFC 4180 ã«å¾ã£ã CSV ãæ±ãããã®ã§ããã°ãfputcsv/fgetcsv ã¨ãããã©ã«ãã® $escape = "\\" ã®ã¾ã¾ä½¿ãã®ã¯ãããããªãã§ãããä½è¨ãªå¦çãå ¥ã£ã¦ãã¾ãã®ã§ã
æ¸ãã¦ãéä¸ã§æ°ä»ãã¾ããããstackoverflow ã§åããããªçåãæãã¦ã人ããã¾ããããã£ã±ããããã«ããåä½ã§ãããã
$escape = '"' ãæå®ããå ´åã®æå
ã¨ã¾ã $escape ã®æå³åãã¯æå¾ ããåä½ã¨ã¯éã£ãããã§ããã$escape = '"' ãæå®ããå ´åã«æå¾ ããéãã«åãã¦ãããã°åé¡ã¯ãªãããã§ãã©ããªãã確èªããã¨ã»ã»ã»
- fputcsv ã§ã¯ã"ããã""ãã§ã¯ãªãã"ãã®ã¾ã¾åºåãã¦ãã¾ããã NG
- fgetcsv ã§ã¯ $escape ã®å¤å®ãããã""ãã®å¤å®ãå ã«æ¥ã¦ãããã""ããã"ãã¨ãã¦ãã¾ãèªã¿è¾¼ãã§ããããã OK
ã¨ããçµæã§ããã
ã¾ã fputcsv ã¯
- ãããã PHP 5.5.4 ã¾ã§ $escape ãªãã·ã§ã³ããªãã£ã
- æ¹è¡ã RFC 4180 ã§æ±ºãããã¦ãã CRLF ã§ã¯ãªããLF ã§åºåãã¦ãã¾ã
- èªåã§åãå¦çãæ¸ãã®ãããã¨ç°¡å
ã¨ãããã¨ã§ãèªåã§å®è£
ããã±ã¼ã¹ãå°ãªããªãã£ãã¨ããã§ã¯ããã®ã§ããã»ã»ã»コミットメッセージ ãè¦ã㨠RFC 4180 ã«å¯¾å¿ã§ãããã $escape ãªãã·ã§ã³ã追å ããããããªã®ã«ãçµå±ç¶æ³ãå¤ãã£ã¦ãªãã®ãã¡ãã£ã¨æ®å¿µã§ããã
ï¼è¿½è¨ï¼
æ¸ããå¾ã§æ°ä»ãããã§ããã$escape ã®æå³ã«æ²¿ã£ã¦ä½¿ãã®ã§ããã°ããããããã"ããã""ãã«ç½®æããä¸ã§ã$escape = '"' ãæå®ã㦠fputcsv ãå¼ã¹ã°ããã§ããã
ï¼è¿½è¨ããã¾ã§ï¼
keboola/csv ã®åä½ã¯ï¼
Composer 㧠CSV ãæ±ãã©ã¤ãã©ãªã§ã¯ãkeboola/csv ã¨ããã®ã人æ°ãããã§ãã
ãã®å®è£ ï¼1.1.3ï¼ã確èªããã¨ããã
- CSV ã®èªã¿è¾¼ã¿
- fgetcsv ã使ç¨
- ã³ã³ã¹ãã©ã¯ã¿ã« $escapedBy ã渡ããã¨ã§ $escape ãªãã·ã§ã³ãå¤æ´å¯ãããã©ã«ãã§ã¯ chr(0) ã使ããã
- CSV ã®åºå
- èªåã§å¦çãè¡ã£ã¦ãã
- ã"ããããå ´åã¯ã""ãã«ãã¦åºåããå½¢
- æ¹è¡ã³ã¼ã㯠LF åºå®
ã¨ãããã¨ã§ããã©ãããã£ã¼ã«ãã®æ«å°¾ã« \0 ãªãã¦å ¥ããªãããã¨ããã®ã§ããã°ããã©ã«ãã®ã¾ã¾ãããã§ãªããªãã° $escapedBy = '"' ã¨ãã¦ä½¿ç¨ããã°ããã§ããããï¼æ¹è¡ã³ã¼ã LF ã許容ã§ãããªãã§ãããï¼
ã©ã¤ãã©ãªã«é ¼ããããªãï¼èªåã§å®è£ ããããªãå ´åã¯ããããè¦ç¿ã£ã¦ fputcsv 㧠$escpae = "\0" ãæå®ãã¦ãå®ç¨ä¸åé¡ã¯ãªãæ°ããã¾ããã
ãã±ã¼ã«ã®è¨å®ã«ã¤ãã¦
ãã ãkeboola/csv ã使ãã°ãã㧠OK ã¨ãããã¨ã¯ãªãããã«ããã¤ãæåã«ã¯æ³¨æã¯å¿ è¦ã§ããfgetcsv ã¯å é¨ã§ãã±ã¼ã«ã®æ å ±ã使ã£ã¦ãã«ããã¤ãæåã®å¢çã調ã¹ãã®ã§ãé©åãªãã±ã¼ã«ãè¨å®ãã¾ãããã
é©åãªãã±ã¼ã«ã¨ããã®ã¯ã»ã»ã»ã¡ãã£ã¨ä¹±æ´ã§ãããWindows ã Linux ã使ã£ã¦ã人ã§ããã°ãåºæ¬çã« C ãã±ã¼ã«ã§ããããããªããã¨æã£ã¦ãã¾ããçç±ã以ä¸ã« 3 ã¤æãã¾ãã
çç±ãã®1: ã©ãã§ã使ãã
ãã±ã¼ã«ã ja_JP.UTF-8 ã«ãã¦ããä¾ãè¦ããã¾ãããen_US.UTF-8 ãããªãã¨å ¥ã£ã¦ããªãç°å¢ããã£ãããã¾ãããå¤ã«ç´°ããæå®ããã¦ãã¾ãã¨å¯æ¬æ§ãä¸ãã£ã¦ãã¾ãã¾ããC ãã±ã¼ã«ãªãã©ãã§ã使ããã®ã§ãã®ç¹ã§ã¯å®å¿ã§ãã
id:moriyoshi ã fgetcsv ããã±ã¼ã«ã«ä¾åãã¦ããçç±ï¼ãããèªãã¨ç´å¾ããããå¾ãªãï¼ã¨ã¨ãã« C ãã±ã¼ã«ã使ãå ´åã®æ³¨æãæ¸ãã¦ããã¦ãã¦ã
ãã ã "C" ãã«ã¼ã«ã§ã¯ portable characters 以å¤ã§ã®æ¨æºé¢æ°ã®æåã¯æªå®ç¾©ãªã®ã§ãlibcã«ãã£ã¦ã¯ãã¾ãåããªãããã
ã¨ã®ãã¨ãªã®ã§ãC ãã±ã¼ã«ã§ portable characters 以å¤ã®æåã 1 ãã¤ãã¨ãã¦æ±ã£ã¦ãããªãä¾ã調ã¹ã¦ã¿ãã®ã§ããã
ã«ãã㨠Plan 9ãMinixã*BSD family ãããã®ããã§ãããã®ãããã®ç°å¢ã§ã使ç¨ããã¹ã¯ãªãããæ¸ãå ´å㯠C ãã±ã¼ã«ä»¥å¤ã«ãã¾ãããã
çç±ãã®2: æåå¢çãæ°ã«ããå¿ è¦ã¯ãã¾ããªã
RFC 4180 ã«ããã CSV ä¸ã§ã®ã¡ã¿ãã£ã©ã¯ã¿ã¯
- LF (U+000A)
- CR (U+000D)
- ã"ã(U+0022)
- ã,ã(U+002C)
ã® 4 ã¤ãªã®ã§ãUTF-8 ã ãã㨠Shift_JIS ã ãã㨠2 ãã¤ãç®ä»¥éã«åºç¾ããªãæåã§ããã"ããã""ãã§ã¨ã¹ã±ã¼ããã¦ããéã㯠1 ãã¤ãåä½ã§æ±ã£ã¦ãåé¡ããã¾ããã
ä¸æ¹ã\ã(U+005C) 㯠Shift_JIS ã® 2 ãã¤ãç®ã«åºç¾ãã¾ãï¼UTF-8 ã® 2 ãã¤ãç®ä»¥éã«ã¯åºç¾ããªãæåã§ãï¼ã®ã§ãShift_JIS ã§ãã¤ã"ããã\"ãã§è¡¨ç¾ããã CSV ãã¡ã¤ã«ãèªãå ´åã ãæåå¢çã«æ³¨æãå¿ è¦ã§ããã¨ã¯ãããç¾å¨ã® PHP ã§ã¯ãã£ã«ã¿ã使ããã®ã§ãããããã UTF-8 ã«å¤æãã¦èªã¿è¾¼ãã§ãã¾ãã°åé¡ããã¾ããã以ä¸ã«ä¾ãããã¾ããã
- 巨大なSJISのCSVファイルをfgetcsv関数で処理する - hnwの日記
- ããã§ä½¿ã£ã¦ãã Stream_Filter_Mbstring ã Composer ã§ä½¿ããããã«ãã¦ããæ¹ããã¾ããã
- xcezx/Stream_Filter_Mbstring
çç±ãã®3: ãã«ããã¤ãã®å¦çããã°ã£ã¦ããï¼
ããä¸ã¤ C ãã±ã¼ã«ãå§ããçç±ããã£ã¦ã$escape = "\\" ã§ã¯ãã«ããã¤ãã®æ±ãã«ãã°ãããããªã®ã§ãã
ããã§ã1,"\ã",ãã¯ããããèªããªãä¾ãæãã£ã¦ãã¾ãããã½ã¼ã¹ãè¦ãã¨ãã¨ã¹ã±ã¼ãæåã®ç´å¾ã§ãããã¨ã示ã state=1 ããã«ããã¤ããèªãã ã¨ãã«è§£é¤ããããã·ã³ã°ã«ãã¤ãã®æåã«åºä¼ã£ãæã«å§ãã¦å¦çãããããã«ãªã£ã¦ãããï¼ã1,"ã\",ãã¯ãããã¨æ¸ããã®ã¨åããããªåä½ã«ãªã£ã¦ãããï¼ã§ãããC ãã±ã¼ã«ãªããã®åä½ã¯åé¿ã§ãã¾ãã
ï¼ä¸ã®ã»ãã«ãæ¸ãã¾ãããã$escape = '"' ã®å ´å㯠$escape ã®å¤å®ãããã""ãã®å¤å®ãå
ã«æ¥ã¦ããã®ã§ããã®å½±é¿ãåãã¾ãããï¼
è足:ãExcel ã§éããæã«ãããããªããã ãã©ãã¨è¨ãããã
è足ã§ãããCSV ãã¡ã¤ã«ã«ã0123ãã®ãããªã³ã¼ããåºåãã¦ããã¨ãã¦ããExcel ã§éãã¨ã123ãã«ãªã£ããããã®ã§ãããªãã¨ããªããªãã®ï¼ãã¨è¨ããããã¨ãããã¨ããã¾ãã
ãã®å ´åã¯ã'0123ãã®ããã«æåååã§ãããã¨ãæ示ãããã="0123"ãã®ããã«è¨ç®å¼ãåãè¾¼ãã ããã¨ãã£ãè¡æ£èã対çãç¥ããã¦ã¾ããã人éã Excel ã§éãã®ãç®çãªã .xls ãã .xlsx ãåºåããã»ããããããããªããã¨æãã¾ãã
2014/12/16 追è¨
ã½ã¼ã¹ãèªã¿è¿ãã¦ã¿ãã¨ããã±ã¼ã«ãåã£ã¦ããªãã£ãå ´åï¼mblen ã -1 ãè¿ããå ´åï¼ãã·ã³ã°ã«ãã¤ãã®æåã¨ãã¦å¦çãã¦ããã®ã§ãShift_JIS ã® CSV ãã¡ã¤ã«ã $escape = "\\" ã§èªãå ´åãé¤ãã¦ã¯ããã±ã¼ã«ãåã£ã¦ããªãã¦ããã¾ãèªããã±ã¼ã¹ãã»ã¨ãã©ã®ãããªæ°ããã¾ããã¨ããããã以å¤ã®ã±ã¼ã¹ã§åé¡ã«ãªãã±ã¼ã¹ãæãã¤ããªãã»ã»ã»ã
ãã®ããã«ããã±ã¼ã«ãè¨å®ããããã¾ããã£ããã¨æ¸ãã¦ãã人ãããã¨å¤ãã®ã§ãä½ãåéããã¦ããããããã¾ãããä½è£ã®ããæã«ããã¡ãã£ã¨èª¿ã¹ã¦ã¿ã¾ãã