带有引号的csv输出中的PHP问题

带有引号的csv输出中的PHP问题,php,csv,Php,Csv,您好,我有一个csv文件,当我在excel中打开它时,它看起来很干净,每行的开头或结尾都没有引号,在写字板中也是一样,它看起来像这样: 10038,"Service, Inc.",loten,4u@att.net,9951,xxx,6321 10041,RoadsideInc.,Kgel,gel1980@gmail.com,1101,xxx,7967 10042,RangLLC,Resgers,resranger85@yahoo.com,2073,4611,xxx 10050,5-Dg,5-dg

您好,我有一个csv文件,当我在excel中打开它时,它看起来很干净,每行的开头或结尾都没有引号,在写字板中也是一样,它看起来像这样:

10038,"Service, Inc.",loten,4u@att.net,9951,xxx,6321
10041,RoadsideInc.,Kgel,gel1980@gmail.com,1101,xxx,7967
10042,RangLLC,Resgers,resranger85@yahoo.com,2073,4611,xxx
10050,5-Dg,5-dg,pik37@gmail.com,3-4874,2838389,xxx
10053,SandserviceInc.,Service Center Inc.,br@sands.com,6-5556,861398,xx
10055,CenStammddy ,Mman,jooan@an.com,6-1449,xx,36-3755
10060,"BetsyRES, C",ElHies,hines@ol.com, 8-0306,237602,xx
10061,Hampnemes LLC,DBERG@gmail.com,83-7999,xxx,-74-1043,xx
10066,CarReal LLC,CarPRea LLC,selby@c.r.com,8889,456440,xx
当我通过下面的脚本在PHP中读取该文件时,我得到了我想要的有效结果,如下所示:

Array
(
    [0] => 10038|Service, Inc.|loten|4u@att.net|9951|xxx
    [1] => 10041|RoadsideInc.|Kgel|gel1980@gmail.com|1101|xxx
    [2] => 10042|RangLLC|Resgers|resranger85@yahoo.com|2073|4611
    [3] => 10050|5-Dg|5-dg|pik37@gmail.com|3-4874|2838389
    [4] => 10053|SandserviceInc.|Service Center Inc.|br@sands.com|6-5556|861398
    [5] => 10055|CenStammddy |Mman|jooan@an.com|6-1449|xx
    [6] => 10060|BetsyRES, C|ElHies|hines@ol.com| 8-0306|237602
    [7] => 10061|Hampnemes LLC|DBERG@gmail.com|83-7999|xxx|-74-1043
    [8] => 10066|CarReal LLC|CarPRea LLC|selby@c.r.com|8889|456440
)
当我读取文件并保存数组时,我使用下面的PHP代码将其作为输出放入一个新的csv文件中,我得到一个输出csv文件,该文件在excel中看起来正常,但在写字板中打开,我看到许多行以引号开头和结尾,如下所示:

"10038|Service, Inc.|loten|4u@att.net|9951|xxx"
10041|RoadsideInc.|Kgel|gel1980@gmail.com|1101|xxx
10042|RangLLC|Resgers|resranger85@yahoo.com|2073|4611
10050|5-Dg|5-dg|pik37@gmail.com|3-4874|2838389
"10053|SandserviceInc.|Service Center Inc.|br@sands.com|6-5556|861398"
"10055|CenStammddy |Mman|jooan@an.com|6-1449|xx"
"10060|BetsyRES, C|ElHies|hines@ol.com| 8-0306|237602"
"10061|Hampnemes LLC|DBERG@gmail.com|83-7999|xxx|-74-1043"
"10066|CarReal LLC|CarPRea LLC|selby@c.r.com|8889|456440"
我保存csv输出文件的方式有问题吗

<?php

function createCSV($rows){
    $csv_filename = "output.csv";
    $fp = fopen($csv_filename, "w");
    foreach ($rows as $field) {
      fputcsv($fp, array($field));
    }
    fclose($fp); 
    echo "csv created";
}
$result = array();
        $row = 1;
        if (($handle = fopen(__DIR__.'/stack.csv', "r")) !== FALSE) {
            while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
                $data_row = array(
                    $data[0],
                    $data[1],
                    $data[2],
                    $data[3],
                    $data[4],
                    $data[5]
                 );                            
                $result[] = implode("|", $data_row);
                $row++;
            }
        }
        echo "<pre>";
        print_r($result);
        echo "</pre>";
        fclose($handle);
        createCSV($result);

请尝试这样保存数据

while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
                $data_row = array(
                    $data[0],
                    $data[1],
                    $data[2],
                    $data[3],
                    $data[4],
                    $data[5]
                 );                            
               // $result[] = implode("|", $data_row); -- change this line to
                 $result[] =  $data
                $row++;
            }
还是你的情况

function createCSV($rows){
    $csv_filename = "output.csv";
    $fp = fopen($csv_filename, "w");
    foreach ($rows as $field) {
      fputcsv($fp, $field, "|");
    }
    fclose($fp); 
    echo "csv created";
}
将此函数更改为包含您的delemiter,并且不要在另一个数组中包装$field(它是一个数组)

        $csv_filename = "output.csv";
        $fp = fopen($csv_filename, "w");
        if (($handle = fopen(__DIR__.'/stack.csv', "r")) !== FALSE && $fp) {
            while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
                $data_row = array(
                        $data[0],
                        $data[1],
                        $data[2],
                        $data[3],
                        $data[4],
                        $data[5]
                );

                echo "<pre>";
                print_r($data_row);
                echo "</pre>";
                fputcsv($fp, $data_row, "|");
            }
        }

        fclose($handle);
        fclose($fp);
        echo "csv created"
更新这里是一种更有效的方法(不需要构建结果数组和循环两次)

$csv\u filename=“output.csv”;
$fp=fopen($csv_文件名,“w”);
if($handle=fopen($DIR.'/stack.csv',“r”)!==FALSE&&$fp){
while(($data=fgetcsv($handle,1000,“,”)!==FALSE){
$data\u行=数组(
$data[0],
$data[1],
$data[2],
$data[3],
$data[4],
$data[5]
);
回声“;
int fputcsv ( resource $handle , array $fields [, string $delimiter = "," [, string $enclosure = '"' ]] )
打印(数据行); 回声“;
int fputcsv ( resource $handle , array $fields [, string $delimiter = "," [, string $enclosure = '"' ]] )
fputcsv($fp,$data_行,“|”); } } fclose($handle); fclose($fp); 回显“已创建csv”
int fputcsv ( resource $handle , array $fields [, string $delimiter = "," [, string $enclosure = '"' ]] )

您需要更改用于在磁盘上写入的函数调用,如下所示:

这是因为最后一个参数是定义行的机柜字符串的参数,如中所述:


默认值是您要删除的引号

您正在使用
内爆(“|“,$data_行)
将所有项目固定为一个,因此这就是您得到的值:一个值。当有空格时,csv将用引号围绕字符串以显示它的一件事。很抱歉,我这样做了:
$data_行=$data[0]。“|“$data[1]。“|”$data[2]。“|”$data[3]。“|”.$data[4]。“|”。$data[5];array_push($result,str_replace(“”,“$data_row));
当我在WordPad中打开文件时,在某些行的开始和结束处仍然有引号,因为这与内爆相同,只需将其保留在数组中,并使用fputcsv和“|“作为分隔符,如我的示例中所示。您的示例在每个csv行中都给出了数组,这就是为什么我必须按照我显示的那样做,您能纠正它吗?@user3593154-这是最初的问题,然后添加内爆就隐藏了它。”。您是否更改了fputcsv($fp,数组($field));到fputcsv($fp,$field);没有阵列?--更新了答案。没有报价,OP正在发送阵列(10066 | CarReal LLC | CarPRea LLC|selby@c.r.com|8889 | 456440),这是因为它有空格并且是一个单字段,即1个带空格的字符串,它被FPUTCSV正确引用检查输出。。。在原始CV中没有的行的末尾和开头有引号。。。OP写道:“当我读取文件并保存数组时,我使用下面的PHP代码将其作为输出放入一个新的csv文件中,我得到一个输出csv文件,该文件在excel中看起来正常,但在写字板中打开,我看到许多行以引号开头和结尾,如下所示……”。所以OP所说的问题是关于Quotes,你是什么意思:
fputcsv($fp,array($field),“|”,“”);