使用PHP计算CSV文件中的列数?

使用PHP计算CSV文件中的列数?,php,mysql,Php,Mysql,在我将文本文件的数据转储到MYSQL数据库之前,是否可以对其进行验证 我想检查它是否包含,比如说,5列(数据)。如果是,那么我继续进行以下查询: LOAD DATA CONCURRENT INFILE 'c:/test/test.txt' INTO TABLE DUMP_TABLE FIELDS TERMINATED BY '\t' ENCLOSED BY '' LINES TERMINATED BY '\n' ignore 1 lines. 如果不是,则删除整行。我对txt文件中的所有行重

在我将文本文件的数据转储到MYSQL数据库之前,是否可以对其进行验证

我想检查它是否包含,比如说,5列(数据)。如果是,那么我继续进行以下查询:

LOAD DATA CONCURRENT INFILE 'c:/test/test.txt' 
INTO TABLE DUMP_TABLE FIELDS TERMINATED BY '\t' ENCLOSED BY '' LINES TERMINATED BY '\n' ignore 1 lines.
如果不是,则删除整行。我对txt文件中的所有行重复此过程

文本文件包含以下格式的数据:

id  col2    col3    2012-07-27-19:27:06 col5

id  col2    col3    2012-07-25-09:58:50 col5

id  col2    col3    2012-07-23-10:14:13 col5

你是什么意思?如果只是指行中的字符数,只需将文件拆分为多行(
explode
),并检查其长度是否等于5


如果您指的是带有delimeters的列,那么您应该在每行中找到该拆分器的出现量,然后再次检查它们是否等于5。使用
fgetcsv
,您可以尝试查看是否足够。如果没有,请更详细地说明列的含义。

我假设您所说的是文件中每行的长度。如果是这样,这里有一个可能的解决方案

$file_handle = fopen("myfile", "r");
while (!feof($file_handle)) {
   $line = fgets($file_handle);
   if(strlen($line)!=5) {
       throw new Exception("Could not save file to database.");
       break;
   }
}
fclose($file_handle);

编辑:阅读您的评论后,下面是对选项卡分隔数据执行相同操作的代码:

$handler = fopen("myfile.txt","r");
$error = false;
while (!feof($handler)){
   fgets($handler,$linetocheck);
   $cols = explode (chr(9), $linetocheck); //edit: using http://es.php.net/manual/en/function.fgetcsv.php you can get the same result as with fgets+explode
   if (count($cols)>$max_cols){
       $error=true;
       break;
   }
}
fclose($handler);
if (!$error){
    //...do stuff
}
这段代码逐行读取一个文件,比如“myfile.txt”,如果其中任何一行的长度超过$max\u cols,则将变量$error设置为true。(很抱歉,如果这不是你要问的,你的问题对我来说不是最清楚的)


是的,这是可能的。我确实做过那件事。使用PHP的csv处理函数

您将需要以下功能:

fopen() fgetcsv()

可能还有其他一些

fgetcsv返回一个数组

我将给您一个简短的示例,说明如何进行验证

以下是csv: col1,col2,col3,col4 1,2,3,4 1,2,3,4, 1,2,3,4,5 1,2,3,4

我将跳过fopen部分,直接进入验证步骤。 请注意“\t”是制表符

$row_length;
$i = 0;
while($row = fgetcsv($handle,0,"\t") {
  if($i == 0) {
    $row_length = sizeof($row);
  } else {
    if(sizeof($row) != $row_length) {
      echo "Error, line $i of the data does not match header size";
      break;
    }
  }
}
这将测试每一行,以确保它与第一行的($i=0)长度相同

编辑: 如果您不知道如何在互联网上搜索,以下是fgetcsv页面:

以下是功能原型: 数组fgetcsv(资源$handle[,int$length=0[,字符串$delimiter=','[,字符串$enclosure='''”[,字符串$escape='\']]])

如您所见,它提供了在发送数据以加载文件中的数据之前在PHP中进行快速扫描所需的一切


我已经在我自己的程序中解决了您的确切问题。我的程序还自动消除了重复行和其他很酷的内容。

我知道这是一个旧线程,但我自己也在寻找类似的内容,我偶然发现了这个主题,但这里提供的答案对我都没有帮助

因此,我提出了我自己的解决方案,该解决方案经过了测试,运行良好(可以改进)

假设我们有一个名为
example.CSV
的CSV文件,其中包含以下虚拟数据(最后一行,第6行,故意包含一个额外数据,然后是其他行):

现在,当我们检查CSV文件以确保所有行都具有相同数量的数据时,下面的代码块将在发生错误的行上执行技巧和锁定点:

    function validateCsvColumnLength($pathToCsvFile)
    {
        if(!file_exists($pathToCsvFile) || !is_readable($pathToCsvFile)){
            throw new \Exception('Filename doesn`t exist or is not readable.');
        }

        if (!$handle = fopen($pathToCsvFile, "r")) {
            throw new \Exception("Stream error");
        }

        $rowLength       = [];
        $rowNumber       = 0;
        while (($data    = fgetcsv($handle)) !== FALSE) {
            $rowLength[] = count($data);
            $rowNumber++;
        }
        fclose($handle);

        $rowKeyWithError   = array_search(max($rowLength), $rowLength);
        $differentRowCount = count(array_unique($rowLength));

        // if there's a row that has more or less data, throw an error with the line that triggered it
        if ($differentRowCount !== 1) {
            throw new \Exception("Error, data count from row {$rowKeyWithError} does not match header size");
        }
        return true;
    }
要实际测试它,只需执行var_dump()即可查看结果:

   var_dump(validateCsvColumnLength('example.csv'));

据我所知,.txt文件没有“列”。你必须给我们一些例子。jquery、html或ajax与此有什么关系?我怀疑asker的意思是“如果文件包含一个SQL insert语句,该语句试图将值插入多于或少于5列中。”“但是,如果我们能看到这个输入文件,那将非常有帮助…:-)@ctrahey:或者这可能意味着OP有一个逗号分隔的数据文件要导入。当然,我认为OP需要澄清文本文件的格式以及定义
列的内容。该文件包含大量以制表符分隔的数据。我使用的是这样的普通插入:将数据并发填充'c:/test/test.txt'加载到表中,以'\t'结尾的转储字段由'\n'括起,以'\n'结尾的行忽略1行;文件内容的示例如下:ID50380294 test.txt one 06-07-12 19:1406-07-12 22:00 2:45:42 ID50378955 test.txt two 29-06-12 19:34 29-06-12 19:46 0:12:00 ID50378884 test.txt three 27-06-12 17:05 27-06-12 20:40 3:35:12 ID50378694 test.txt three 25-06-12 21:14 1:55:36@TendaiGomo:您能编辑您的原始问题并添加吗那个信息?这可能会有帮助。@TendaiGomo使用fgetcsv查看我的答案。它应该有你需要的一切。
    function validateCsvColumnLength($pathToCsvFile)
    {
        if(!file_exists($pathToCsvFile) || !is_readable($pathToCsvFile)){
            throw new \Exception('Filename doesn`t exist or is not readable.');
        }

        if (!$handle = fopen($pathToCsvFile, "r")) {
            throw new \Exception("Stream error");
        }

        $rowLength       = [];
        $rowNumber       = 0;
        while (($data    = fgetcsv($handle)) !== FALSE) {
            $rowLength[] = count($data);
            $rowNumber++;
        }
        fclose($handle);

        $rowKeyWithError   = array_search(max($rowLength), $rowLength);
        $differentRowCount = count(array_unique($rowLength));

        // if there's a row that has more or less data, throw an error with the line that triggered it
        if ($differentRowCount !== 1) {
            throw new \Exception("Error, data count from row {$rowKeyWithError} does not match header size");
        }
        return true;
    }
   var_dump(validateCsvColumnLength('example.csv'));