簡體   English   中英

從csv到帶有行尾字符的數組

[英]from csv to array with end of line chars

使用此功能解析php im中的CSV文件:

private function _csvToArray($url, $delimiter=',')
{
    $csvData = file_get_contents($url);
    $lines = explode(PHP_EOL, $csvData);
    $array = array();
    foreach ($lines as $line) {
        $array[] = str_getcsv($line, $delimiter);
    }

    return $array;
}

這里的問題是,如果CSV文件包含任何帶有行尾字符的字段,則我將使用EOL來確定行尾,這會導致錯誤。

例:

Product_Name, "Description"
Product_Name, "Description"
Product_Name, "Description"
Product_Name, "Description"

可以,但是如果我有這樣的東西:

Product_Name, "Description_line_1
Description_line_2"
Product_Name, "Description_line_1
Description_line_2"
Product_Name, "Description_line_1
Description_line_2"

腳本會失敗,有什么辦法可以改進腳本以考慮此問題,還是最好在調用sript之前使用正則表達式先修復CSV?

這樣的事情應該起作用(已經正確測試了代碼):

$csv = array_map('str_getcsv', file($url), ',', '"');

我周圍有一個舊代碼,曾經為我修復過一次。

$url = 'file.csv';
$csv = array();
$csvContents = file_get_contents($url);

$lines = explode('"'."\n", trim($csvContents));
foreach($lines as $lineNumber => $line) {
    $csv[$lineNumber] = array();
    $fields = explode(',', $line);
    foreach($fields as $field) {
        $csv[$lineNumber][] = ltrim(rtrim($field, '"'), '"');
    }
}

如果您想自己保存對臨時文件的寫入,則可以使用內存流。

private function _csvToArray($url, $delimiter=',')
{
    $fp = fopen('php://memory', 'r+');
    fwrite($fp, file_get_contents($url));

    fseek($fp, 0);

    $array = array();

    while ($row = fgetcsv($fp, 0, $delimiter)) {
        $array[] = $row;
    }

    fclose($fp);

    return $array;
}

如果字段數據在附件字符之間,則fgetcsv可以處理字段中的EOL。

private function _csvToArray($url, $delimiter=',', $enclosure='"')
{
    $handle = fopen($url, 'r');
    $array = array();

    while($row = fgetcsv($handle, 0, $delimiter, $enclosure))
    {
        $array[] = $row;
    }

    fclose($handle);
    return $array;
}

暫無
暫無

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

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