【问题标题】:str_getcsv examplestr_getcsv 示例
【发布时间】:2011-05-29 17:28:49
【问题描述】:

我想将逗号分隔的值字符串解析为数组。我想尝试str_getcsv() php 函数,但我找不到任何关于如何使用它的好例子。

例如,我有一个输入,用户在其中提交编程语言(php、js、jquery 等)的标签,例如当您提交问题时在 stackoverflow 中输入“标签”。

如何使用 str_getcsv 将带有示例 value="php, js, jquery" 的输入转换为数组?

【问题讨论】:

  • 你为什么不使用只是爆炸功能?
  • 也许我误会了你,但$myArray = str_getcsv($value); 应该这样做?
  • @heximal:这样做有什么好处?
  • @heximal,我假设 str_getcsv 更适合我的情况,因为它适用于 CSV
  • @heximal:explode 不会考虑带括号的逗号文本。

标签: php csv


【解决方案1】:

http://us3.php.net/manual/en/function.str-getcsv.php 的规范确实不包含标准示例,但用户提交的注释在涵盖它方面做得不错。如果这是一个表单输入:

$val = $_POST['value'];
$data = str_getcsv($val);

$data 现在是一个包含值的数组。试试看是否还有其他问题。

【讨论】:

    【解决方案2】:

    我认为你应该看看explode 来完成这项任务。

     $values  = "php, js, jquery";
     $items = explode(",", $values);
    
     // Would give you an array:
     echo $items[0];  // would be php
     echo $items[1];  // would be js
     echo $items[2];  // would be jquery
    

    这可能比 str_getcsv() 更有效;

    请注意,您需要使用 trim() 来删除项目值前后可能存在的空格。

    更新:

    我以前没有见过 str_getcsv,但是在手册页上阅读了这句话,这会让它看起来是一个有价值的候选者:

    为什么不使用explode() 而不是str_getcsv() 来解析行? 因为explode() 不会处理可能的封闭部分 字符串或转义字符正确。

    【讨论】:

    • 例如感谢 +1。 Explode 是一个很好的功能,但 str_getcsv 似乎会自动修剪空白。我在 2 之间进退两难。
    【解决方案3】:

    为了简单和可读性,我通常发现自己只使用explode(),只有在满足以下两个条件时才添加str_getcsv():1) 数据本身也使用主分隔符; 2) 我试图用作主要分隔符的标记被另一个不同的字符包围。

    例如,CSV 文件的基本解析器:

    $filename = $argv[1];
    if (empty($filename)) { echo "Input file required\n"; exit; }
    $AccountsArray = explode("\n", file_get_contents($filename));
    

    只要 $AccountsArray 的每个元素没有在数据本身中嵌入“,”,这将完美地工作并且简单易懂:

    foreach ($AccountsArray as $entry) {
        $acctArr = explode(",", $entry);
    }
    

    但是,通常数据将包含分隔符,此时必须存在封闭标记(在本例中为 ")。如果是这样,那么我会像这样切换到 str_getcsv():

    foreach ($AccountsArray as $entry) {
        $acctArr = str_getcsv($entry, ",", "\""); 
    }
    

    【讨论】:

    • 感谢分享!从文件中获取数据时这很好。
    • 我认为这应该是公认的答案。很清楚并显示了如何使用 str_getcsv() 代替我正在使用的 explode()。
    【解决方案4】:
    //get the csv
    $csvFile = file_get_contents('test.csv');
    //separate each line
    $csv = explode("\n",$csvFile);
    
    foreach ($csv as $csvLine) {
    
        //separet each fields
        $linkToInsert = explode(",",$csvLine);
        //echo what you need
        //$linkToInsert[0] would be the first field, $linkToInsert[1] second field, etc
        echo '• ' . $linkToInsert[1] . '<br>';
    }
    

    【讨论】:

    • 这通常是行不通的。如果一个字段包含换行符怎么办?还是逗号?
    • 在这种情况下,我认为您可以在爆炸前使用 str_replace “过滤”或删除新行和任何其他您不想要的东西。
    • 示例:"Field 1","Field 2","Field with a, comma","Field 4" 您是否删除了 Field 3 中的逗号?如何?也许逗号在这里是有原因的?
    • 在这种情况下,它取决于 csv 文件的创建方式。通常,当我创建一个 csv 文件时,我会选择一个字段分隔符,例如“->”,因此它会给出“字段 1”、“字段 2”等...如果它不是 csv 文件,为什么要使用函数 str_getcsv () ?
    • CSV 表示“逗号分隔值”,许多应用程序都可以读取或写入该格式。 WIWSV(“我想要的任何分隔值”)对于某些用途来说是完全可以的,但您将无法使用例如 Excel 读取或写入它。
    【解决方案5】:

    代码很简单,使用Str_getcsv函数,我们就去 通过位于 与我们的脚本相同的目录。

    注意:使用的函数与 PHP >= 5.3.0 的版本兼容

    //First, reading the CSV file
    
    $csvFile = file('file.csv');
    
    foreach ($csvFile as $line) {
        $url = str_getcsv($line);
    
        $ch = curl_init($url[0]);
    
        $name = basename($url[0]);
    
        if (!file_exists('directory/' . $name)) {
            $fp = fopen('directory/' . $name, 'wb');
        }
    
        curl_setopt($ch, CURLOPT_FILE, $fp);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_exec($ch);
        curl_close($ch);
        fclose($fp);         
    }
    

    【讨论】:

      猜你喜欢
      • 2016-08-07
      • 2011-12-27
      • 2011-09-28
      • 2013-04-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2012-01-11
      相关资源
      最近更新 更多