簡體   English   中英

csv輸出中帶引號的PHP問題

[英]PHP issue in csv output with quotes

您好,我在excel中打開一個csv文件時,它看起來很干凈,每行的開頭或結尾都沒有引號,在寫字板中也是如此:

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);

csv輸入和輸出文件如下:

輸入CSV

輸出csv

嗨,嘗試像這樣保存數據

fputcsv ( resource $handle , array $fields [, string $delimiter = "," [, string $enclosure = '"' ]] )

或您的情況

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++;
            }

更改此函數以包含您的delemiter,並且不要將$ field(這是一個數組)包裝在另一個數組中

function createCSV($rows){
    $csv_filename = "output.csv";
    $fp = fopen($csv_filename, "w");
    foreach ($rows as $field) {
      fputcsv($fp, $field, "|");
    }
    fclose($fp); 
    echo "csv created";
}

這里更新是一種更有效的方法(您無需構建結果數組並循環2次)

        $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"

您需要按以下方式更改用於寫入磁盤的函數調用:

fputcsv($fp, array($field),"|","");

這是因為最后一個參數是定義行的附件字符串的參數,如php手冊中所述

int fputcsv ( resource $handle , array $fields [, string $delimiter = "," [, string $enclosure = '"' ]] )

默認值為您要刪除的引號

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM