2017-09-14 40 views
0

我正在使用php从数据库中下载表并将其保存为.csv文件。但是当其中一个列在字符串中包含逗号“,”时,脚本会将字符串的其余部分(逗号后面)带到新列中。我怎样才能让脚本忽略这个逗号?csv不会忽略','(逗号),并使用php创建一个新的行

我试过在旁边放一个'\'或使用stripcslashes(),但没有任何效果。

部分代码的

$rows = mysqli_fetch_assoc($select_table); 

if ($rows) 
{ 
    getcsv(array_keys($rows)); 
} 
while($rows) 
{ 
    getcsv($rows); 
    $rows = mysqli_fetch_assoc($select_table); 
} 

// get total number of fields present in the database 
function getcsv($no_of_field_names){ 
    $separate = ''; 
// do the action for all field names as field name 
    foreach ($no_of_field_names as $field_name) 
     { 
      if (preg_match('/\\r|\\n|,|"/', $field_name)) 
       { 
       $field_name = '' . str_replace(',','!', $field_name) . ''; 
      } 
      echo str_replace('!',',', $field_name) . $separate . $field_name; 
      //sepearte with the comma 
      $separate = ','; 
} 

//make new row and line 
echo "\r\n"; 
} 
?> 

编辑:

如果我不使用逗号,然后CSV文件将无法正常在Excel加载(逐列,行通过行)。

在任何人开始说你为什么要这样做,而我正在做它的实践。

+3

你为什么要写出你自己的CSV解析器?改用[fputcsv](http://php.net/manual/en/function.fputcsv.php)。该页面的第一条评论是关于将其写入浏览器的。这将创建一个格式正确的CSV字符串。 – aynber

+0

练习的人!实践!!!! – noel293

+1

heh。好的,我会给你的。那么你想要做的是,如果该值包含逗号,请在该值附近加引号。这将告诉任何CSV解析器,该字符串内部的字符串不应该被分割,直到它碰到下一个引号。 – aynber

回答

0

把$ field_name放在引号中,以便被视为字符串将做的伎俩!

if (preg_match('/\\r|\\n|,|"/', $field_name)) 
       { 
       $field_name = '"'.$field_name.'"'; 
      //field_name = '' . str_replace(',','.', $field_name) . ''; 
      } 
1

既然你都练,这里是CSV一些基本的规则(假设逗号作为分隔符):

123,test,456 

当一个字段包含分离器,该字段必须用双引号:

123,"monitor, Samsung","45,8" 

换句话说,如果一个字段是双引号括起来,这并不意味着它是一个字符串,只存在(或可能)领域内的隔板。

当引用字段还包含引号,那些必须与其他报价进行转义:

123,"monitor 24"", Samsung","45,8" 

记住这一点,当你的解析自己是非常重要的。 (实际上,一旦你开始使用双引号,包含双引号各个领域也应该被引用,即使里面有没有分隔符)

多行字段还必须在双引号:

123,"monitor 24"", Samsung","test multiline 
field","45,8" 

以上实际上是1排。

相关问题