PHP:如何在多列行中删除双引号内的逗号?

时间:2009-04-07 13:53:27

标签: php regex csv

我需要一个PHP解决方案来摆脱双引号内的逗号。我似乎无法使用preg_replace找出解决方案。

我正在从昏迷分隔的文本文件中将数据插入数据库。

文本文件中的某些列包含多个用双引号括起来的单词。这些双引号内部有逗号,所以当我尝试使用逗号分隔列将文本插入我的数据库时,它会读入双引号之间的引号并将它们转换为列。

以下是文本文件中的行的显示方式:

partname,2035, "this is, desc,ription",qty, "another, description",

当我尝试将其分开时会发生这种情况:

results partname, 2035, this is, desc, ription, qty, another, description, 

这就是我想要的:

partime, 2035, this is description, qty, another description,

如您所见,双引号括起的部分不应拆分为单独的列。我不知道如何解决这个问题;有人能指出我正确的方向吗?

6 个答案:

答案 0 :(得分:3)

伙计们,PHP已经有了这个函数,fgetcsv(从文件中获取逗号分隔值)

<?php
$r = array();
$fh = fopen('test.txt','r');
while($t = fgetcsv($fh)) {
    $r[] = $t;
}
var_dump($r);

自PHP4时代以来就存在这种情况。

答案 1 :(得分:2)

function csv_string_to_array($str){
$expr="/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/";
$results=preg_split($expr,trim($str));
return preg_replace("/^\"(.*)\"$/","$1",$results);
}

这就是诀窍。

答案 2 :(得分:0)

你想要的是str_getcsv()函数。它只能在PHP5.3.0 +中使用。

答案 3 :(得分:0)

尝试此功能可将单行拆分为原始值。它试图应对非常不规则的CSV

function csv_split( $src, $comma = ',', $esc = '\\' ){
    $a = array();
    while( $src ){
        $c = $src{0};
        switch( $c ){
        // permit empty values
        case ',':
            $a[] = '';
            $src = substr( $src, 1 );
            continue 2;
        // ignore whitespace
        case ' ':
        case "\t":
            preg_match('/^\s+/', $src, $r );
            $src = substr( $src, strlen($r[0]) );
            continue 2;
        // quoted values
        case '"':
        case "'":
        case '`':
            $reg = sprintf('/^%1$s((?:\\\\.|[^%1$s\\\\])*)%1$s\s*(?:,|$)/', $c );
            break;
        // naked values
        default:
            $reg = '/^((?:\\\\.|[^,\\\\])*)(?:,|$)/';
            $c = ',';
        }
        if( preg_match( $reg, $src, $r ) ){
            $a[] = empty($r[1]) ? '' : str_replace( '\\'.$c, $c, $r[1] );
            $src = substr( $src, strlen($r[0]) );
            continue;
        }
        // else fail
        trigger_error("csv_split failure", E_USER_WARNING );
        break;
    }
    return $a;
}

答案 4 :(得分:0)

这可能对您有用:

$pieces = explode( '"', 'partname,2035, "this is, desc,ription",qty, "another, description",' );

// explode the ones we should split (will be even-# elements)
for ( $i=0; $i<= count($pieces); $i+=2 ) {
    $tmpArray   = explode(",", $pieces[$i]);
    foreach($tmpArray as $value) {
        if ( strlen(trim($value)) > 0 ) {
            $finalArray[] = $value;
        }
    }
}

// now add the ones we shouldn't split inside quotes (odd-# elements)
for ( $i=1; $i<= count($pieces); $i+=2 ) {
    if ( strlen(trim($pieces[$i])) > 0 ) {  
        $finalArray[] = $pieces[$i];
    }
}

// show the result
echo "<pre>";
print_r($finalArray);
echo "<pre>";

答案 5 :(得分:0)

该问题的一般解决方案是在使用简单组合逗号分隔数据之前在创建行时转义分隔符。

define(SEPARATOR,',');
$dataField = str_replace(SEPARATOR,'BSLASH'.SEPARATOR,$dataField);

请将BSLASH更改为反斜杠字符(注释输入框比我更聪明,因为当我尝试编写反斜杠字符时它表现得很奇怪,我无法弄清楚如何关闭它:))

当然,如果您从第三方来源收到数据,则无法选择。