【问题标题】:how to remove quotes from csv in php如何在php中从csv中删除引号
【发布时间】:2013-08-19 14:15:05
【问题描述】:

我有一个从 DB 获取的数组。在这个项目中,我将我的数组转换为 csv 文件。但是每次我打开文件时,我都会得到双引号。我尝试使用 str_replace 和 preg_place 没有成功。如何删除引号

这是我的 csv 代码

$query = "SELECT t.transactiontime, t.restaurant_id, t.transactionid, t.cardid, emd.m_field_id_2, t.pricebefordiscount, t.menucard_cut
from transactions as t
left join exp_member_data AS emd ON (t.cardid-10000000 = emd.member_id) order by t.transactiontime desc limit 50";

$transactions_query = ee()->db->query($query);
$transactions_result = $transactions_query->result_array();

$transaction_array = array();
foreach ($transactions_result as $key) 
{
  $date = new DateTime($key['transactiontime']);
  $newdate = $date->format('d.m.Y');


 $transaction_array[] = array(
    'transactiontime' => $newdate,
    'restaurant_id' =>  $key['restaurant_id'], 
    'member' => $key['transactionid'] . " " . $key['m_field_id_2'],
    'pricebefordiscount' => $key['pricebefordiscount']/100,
    'menucard_cut' => $key['menucard_cut']
    ); 


}


function outputCSV($data) 
    {

$outstream = fopen("php://output", 'w');



function __outputCSV(&$vals, $key, $filehandler) 
{
    fputcsv($filehandler, $vals, ';');
}

array_walk($data, '__outputCSV', $outstream);

fclose($outstream);
}

outputCSV($transaction_array);

我的输出

19.08.2013;47657;"12459 Abdullahi";60;
19.08.2013;47658;"12455 atima";30;

【问题讨论】:

  • CSV 文件中字段周围的引号是完全有效的,任何再次读取文件的内容都应该正确处理它们。
  • 是否可以删除它们?
  • 当然有可能,但你为什么要这样做是个问题。也许有更好的解决方案。
  • 我假设它们是由 fputcsv 添加的;在这种情况下,您需要编写自己的函数来输出 CSV。
  • ^ 来完成这个评论,看看这里如何写入你自己的文件。很简单:php.net/manual/en/function.fwrite.php

标签: php csv


【解决方案1】:
Re write the file and try to parse csv file:

$file_path = "Book1.csv";
$string = file_get_contents($file_path, FILE_USE_INCLUDE_PATH);
echo $string;
echo "<br><br><br>";
$string2 = str_replace('"', " ", $string);
echo $string2;
file_put_contents($file_path, $string2); 
exit;

【讨论】:

    【解决方案2】:

    引号确实没有错。它们避免了某些 CSV 使用空格作为分隔符时可能发生的任何混淆:

    data    "some more"    another thing
    //is not the same as:
    data    some more    another thing
    

    但是,如果您想删除它们,请将此正则表达式应用于每一行:

    $line = preg_replace('/(^|;)"([^"]+)";/','$1$2;',$line);
    

    你应该没事。
    它是如何工作的:

    • (^|;) 匹配(并捕获)行首或分号
    • " 匹配文字 "(不捕获)
    • ([^" ]+):匹配并捕获至少一个 not 的字符 "
    • ";:匹配(不捕获)文字 ";
    • $1$2;$1 是对第一个匹配组的反向引用 ((^|;))
      $2 引用 ([^";]+); 只是文字

    假设$line'19.08.2013;47657;"12459 Abdullahi";60;',结果(在preg_replace 调用之后)将是:'19.08.2013;47657;12459 Abdullahi;60;'。引号不见了。

    但是,如果某些字段包含 " 字符,它可能会被转义 (\"),因此为了防止正则表达式无法发现这一点,这里使用了前瞻断言:

    $line = preg_replace('/(?<=^|;)"(.+)"(?=;)/','$1',$line);
    

    区别:

    • (?&lt;=^|;) 一个非捕获的正面回顾。模式中的下一个内容只有在字符串开头 (^) 或分号开头时才会匹配
    • (.+) 现在是第二组。它匹配所有内容,包括 " 但是:
    • "(?=;) 这匹配 " 仅当它后跟 ;

    当出现'19.08.2013;47657;"12459 \"Abdullahi\"";60;' 之类的行时,后一个表达式将返回19.08.2013;47657;12459 \"Abdullahi\";60;

    【讨论】:

    • 你把代码放在哪里 $line = preg_replace('/(^|;)"([^"]+)";/','$1$2;',$line); ?
    • @Zaz:您的代码中没有任何地方,只是注意到您使用的是fputcsv。该功能可能是添加引号。所以要么使用fwrite($handle, implode(';',$array));,要么编写你自己的csv制作函数。如果引号仍然存在,请在调用 fwrite 时将此 preg_replace 应用于每一行
    【解决方案3】:

    试试这个

    $array = array('19.08.2013',47657,'"12459 Abdullahi"');
    $array = str_replace('"', '', $array);
    outputCSV($array);
    

    所以在你的代码中可能是这样的

    $transaction_array = str_replace('"', '', $transaction_array);
    

    或查看这个帖子

    Avoid default quotes from csv file when using fputcsv

    【讨论】:

      【解决方案4】:

      在 CSV 中,单元格值用引号括起来通常是有充分理由的。通常是因为单元格值包含列值分隔标记存在危险/恐惧。在解析 CSV 时删除它们可能会造成严重破坏。

      在格式良好的 CSV 文件中,如果单元格用引号括起来,则需要对构成单元格值一部分的引号进行转义。转义非常重要,否则读取 CSV 的解析器将无法理解单元格值的开始和结束位置。

      不幸的是,犯了错误。您可能在这里,因为您必须解析创建者没有正确转义其 CSV 的 CSV。因此,下面是去除引号的最终方法。以下 RegEx 将删除单元格值的开头和结尾处的引号,但不会删除其中的引号。

      $delimiter = ',';
      $enclosure = '"';
      $row = preg_replace("/(?:(?<=^|{$delimiter}){$enclosure})|(?:{$enclosure}(?=$|{$delimiter}))/",'',$row);
      

      如果您的分隔符是竖线,请确保在其前面加上 2 个反斜杠字符 (\\|)。

      可以在here找到一个演示。

      【讨论】:

        猜你喜欢
        • 2014-02-24
        • 1970-01-01
        • 2022-01-20
        • 2023-03-05
        • 2017-02-13
        • 2020-03-14
        • 2014-05-05
        • 1970-01-01
        相关资源
        最近更新 更多