2011-12-14 14 views
14

के लिए लिख रहाभागने अर्धविराम चरित्र जब csv फ़ाइल

=HYPERLINK("http://example.com"; "Example") 
अल्पविराम से अलग की CSV फ़ाइल में

की तरह कुछ लिखना चाहते हैं, लेकिन एक्सेल अर्धविराम पार्स करके अन्य कक्ष में "उदाहरण") हिस्सा डालता है। मैंने बैकस्लैश के साथ अर्धविराम से बचने और किसी भी किस्मत के बिना डबल कोट्स में सब कुछ लपेटने की कोशिश की।

कोई मदद?

उत्तर

16

डबल कोट्स के साथ रैपिंग पहले से ही सही विचार था, लेकिन आपको यह सुनिश्चित करना होगा कि आप इसे सही तरीके से करें। आप डबल कोट्स के भीतर एक कॉलम डाल सकते हैं, फिर अंदर सबकुछ एक मान के रूप में माना जाता है। उद्धरणों को स्वयं को दो लिखकर बचाना होगा ("")।

उदाहरण इस बात के लिए देखें:

Column A;Column B;Column C 
Column A;"Column B; with semicolon";Column C 
Column A;"Column B"";"" with semicolon and quotes";Column C 
Column A;"=HYPERLINK(""http://example.com""; ""Example"")";Column C 
3

मैं भी एक बहुत ही जंगली समय पूरी तस्वीर यह पता लगाने के लिए tring था तो कैसे मैं अपने सभी सीएसवी php में एक्सेल में खोलने के लिए तैयार मिल गया है (जो यूटीएफ 8 एन्कोडिंग भी शामिल है):

$sep='";"';//note the separator is double quoted 
while($t=mysql_fetch_assoc(mysql_query('select ..')){ 
    #replaces the caracters who are breaking csv display 
    $t=array_map(function($x){return str_replace(array("\n","\r",'"'),array('\\n',"\\r",'""'),$x);},$t); 
    $csv.="\n\"".implode($sep,$t)."\""; 
} 
$charset='utf-8'; 
header('Content-Type: application/csv;charset='.$charset); 
header('Content-Disposition: attachment; filename="filename.csv"'); 
$bom=chr(239).chr(187).chr(191);#this tells excel document is utf8 encoded 
die($bom.$csv); 
0

मैं इस कार्य का उपयोग प्रत्येक सीएसवी मान के लिए सही ढंग से पास करने के लिए करता हूं। यह केवल एक मान उद्धृत करता है यदि इसमें नई रेखा प्रतीकों, डबल कोट्स या विभाजक शामिल हैं। असल में, बचने का एकमात्र मूल्य डबल कोट्स प्रतीक है। अन्य सभी सेल सामग्री इसमें शामिल हो जाती है और एक्सेल में सही तरीके से प्रदर्शित होती है।

विंडोज के तहत सिरिलिक लोकेल में एक्सेल और ओडीबीसी सीएसवी पार्सर्स के विभिन्न संस्करणों के साथ जांच की गई।

/** 
* This function escapes single CSV value if it contains new line symbols, quotes or separator symbol and encodes it into specified $encoding. 
* 
* @param string $source - origin string 
* @param string $sep - CSV separator 
* @param string $source_encoding - origin string encoding 
* @param string $encoding - destination encoding 
* 
* @return string - escaped string, ready to be added to CSV 
* 
* @example echo escapeStringCSV("Hello\r\n\"World\"!"); 
* will output 
*  "Hello 
*  ""World""!" 
*/ 
function escapeStringCSV($source, $sep=';', $source_encoding='utf-8', $encoding="windows-1251//TRANSLIT"){ 

    $str = ($source_encoding!=$encoding ? iconv($source_encoding, $encoding, $source) : $source); 

    if(preg_match('/[\r\n"'.preg_quote($sep, '/').']/', $str)){ 
     return '"'.str_replace('"', '""', $str).'"'; 
    } else 
     return $str; 
} 

तो उपयोग इस तरह हो सकता है:

while($row = mysql_fetch_assoc($res)){ 
    foreach($row as $val){ 
     $csv .= escapeStringCSV($val).';'; 
    } 
    $csv .= "\r\n"; 
} 
संबंधित मुद्दे