【问题标题】:Importing csv file to mysql in php - how to ignore empty rows?在 php 中将 csv 文件导入 mysql - 如何忽略空行?
【发布时间】:2017-05-13 09:32:53
【问题描述】:

如果我尝试导入 csv 文件,所有空行也会被导入。

我有一个带有 csv 文件的表单

以下是表单动作代码

$file = $_FILES['file']['tmp_name'];
$allowedExts = array("csv");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);

if (!in_array($extension, $allowedExts)) {
        $this->session->set_flashdata('msg', 'Please upload a csv file format.');
    }
    else {
    $handle = fopen($file, "r");
    $c = 0;
    $flag = true;
    while(($filesop = fgetcsv($handle, 0, ",")) !== false)
    {
        if($flag) { $flag = false; continue; } //to skip the title row

        if($filesop != NULL ) {  //CONDITION TO CHECK EMPTY ROWS (DOES not work..)

       $data[] = array(
                'id'=>0, //uploader user id
                'field1' => (isset($filesop[14]) ? $filesop[14] : "" ),
                'field2' => (isset($filesop[15]) ? $filesop[15] : "" ),
                'field3' => (isset($filesop[1]) ? $filesop[1] : "" ),
                'field4' => (isset($filesop[13]) ? $filesop[13] : "" ),
                'field5' => (isset($filesop[6]) ? $filesop[6] : "" ),
                'field6' => (isset($filesop[2]) ? $filesop[2] : "" ),
                'field7' => (isset($filesop[5]) ? $filesop[5] : "" ),
                'field8' => (isset($filesop[3]) ? $filesop[3] : "" ),
                'field9' => (isset($filesop[4]) ? $filesop[4] : "" ),
            );
        }
    }
           echo "<pre>";
    print_r($data);
    exit;

请帮我解决,我该怎么做才能不导入空行

【问题讨论】:

  • 也试过 if(array( null ) != $filesop) 条件,不起作用我做错了什么请告诉我我没有得到它
  • 尝试用 if(!empty($filesop)) 替换 $filesop != NULL
  • 也试过..那个
  • 我想说直接在你的一个键上尝试 if 条件,如下 if(!empty($filesop[1])) 你能给我们看一个你的 CVS 的例子吗?
  • 使用$empty_filesop = array_filter( array_map( 'trim', $filesop) ); if( !empty( $empty_filesop)){ ... }

标签: php mysql csv


【解决方案1】:

我会使用 array_filter 从数组中删除空元素,然后检查是否有任何剩余。

while(($filesop = fgetcsv($handle, 0, ",")) !== false){

  $empty_filesop = array_filter( array_map('trim', $filesop));

  if( !empty( $empty_filesop ) ){

      .....
  }
}

带有修剪的数组映射,将修剪数据以删除带有空格的行,例如,{space},这样想:

  foreach( $empty_filesop as &$item ) 
     $item = trim( $item );

另外,请注意 PHP 将一些您可能不认为是空的东西视为空的,并将使用标准的 array_filter 将它们删除,例如 0 中的 ,0,array( 0, 'blah' ) 带有 0 的元素会被移除。如果您需要更高的准确性,可以执行以下操作:

 $empty_filesop = array_filter(
        array_map('trim', $filesop),
        function( $item ){
            return strlen( $item ); //return the string length of $item ( 0 is false > 0 is true )
        }
 );

如果你依赖元素位置,如果有空行,它会改变,所以复制它来检查。例如使用$empty_filesop 这样您就不会使用过滤器更改实际行...

http://php.net/manual/en/function.array-filter.php

http://php.net/manual/en/function.array-map.php

http://php.net/manual/en/function.trim.php

对于标题这样做(我不知道原始键):

$headers = false;
$order = ['id'=>0, 'org3'=>'', 'org2'=>'', 'org1'=>''];
while(($filesop = fgetcsv($handle, 0, ",")) !== false)
{
    if(!$headers) { $headers = $filesop; continue; } 

    $empty_filesop = array_filter( array_map('trim', $filesop));

    if( !empty($empty_filesop)){
      //check for empty rows
      if( count( $headers ) == count($filesop) ) {  
       //check for rows with extra or missing delimiters.
        $data[] = array_replace( $order, array_combine( $headers, $filesop)); //combine with original headers, and replace the data in the 'order row' to re-order.
       }else{
           //row is missing or has extra delimiters.
       }
    }
}

【讨论】:

  • 非常感谢!! array_filter 和 array_map 工作。还有一件事.. 我在 csv 文件的某些行中有逗号分隔值,因此 fgetcsv($handle, 0, ",") 不会在表中导入正确的数据我可以使用 "\t" 但对于那个病必须以文本(制表符分隔)格式保存文件,我只需要一个 csv 文件..你能告诉我怎么做..
  • 如果它们在文本中有逗号,PHP 应该可以很好地处理它,如果它们被引用为 "data with, comma", 1234, ...fputcsv 默认情况下会这样做,它实际上也引用带有空格的字段,例如 "field with spave", 1233, 它是 fgetcsv 函数中的 $enclosure 部分,默认 " 是引号。
  • 为此我不得不在 csv 文件中添加双引号 .. ?
  • 哦,你不需要这样做fgetcsv($handle, 0, ",") 你可以只做fgetcsv($handle) 这些是默认值。
  • 取决于添加的含义,CSV 来自何处。默认情况下,Excel 和 PHP fputcsv 都应该这样做。如果你在像 Notepad++ 这样的文本编辑器中打开它,它应该看起来像这样field,"field with space","field with, comma"。 PHP 甚至可以处理行返回,只要字段有引号"data \n foo",如果字段没有被引用,那么它的编写方式就有问题。
【解决方案2】:

改变

if ($filesop != null) 

if ($filesop !== array(null)) // note the triple equals

查看文档的返回值部分:http://php.net/manual/en/function.fgetcsv.php

【讨论】:

  • 我尝试在 while 循环中打印 $filesop 我没有得到空行的 null 而是我得到一个数组作为 Array ( [0] => [1] => [2] => [3] => [4] => [5] => [6] => [7] => [8] => [9] => [10] => [11] => [12] => [13] => [14] => ) 代码中有什么不合适的地方吗..
  • 数组中有不可见的字符吗?
  • 为什么我没有得到空行的 null .. 你能检查我的代码
  • 如何检查 bcs 如果我打印数组它给出的数组如上面的评论..
  • @san - 这是因为您的文件中有分隔符,例如 ,,,, 变为 array(0=&gt;'', 1=&gt;'',2=&gt;'', ... )。所以你必须删除空元素然后检查,就像我的回答一样。
猜你喜欢
  • 2016-02-17
  • 2012-01-15
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多