2012-08-05 171 views
-5

在将数据转储到MYSQL数据库之前,是否可以验证文本文件?使用PHP计算CSV文件中的列数?

我想检查它是否包含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 
+3

据我所知,.txt文件没有“列”。你将不得不举出一些例子。 – David 2012-08-05 22:44:51

+1

如何定义“列”? – 2012-08-05 22:44:51

+0

jquery,html或ajax与此有什么关系? – tigrang 2012-08-05 22:46:32

回答

2

编辑:看了您的意见后,这里的做同样的制表符分隔数据的代码:

$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_cols,则将变量$ error设置为true。 (我的道歉,如果这不是你要求的,你的问题不是我最清楚的)

$handler = fopen("myfile.txt","r"); 
$error = false; 
while (!feof($handler)){ 
    fgets($handler,$linetocheck); 
    if (strlen($linetocheck)>$max_cols){ 
     $error=true; 
     break; 
    } 
} 
fclose($handler); 
if (!$error){ 
    //...do stuff 
} 
0

你是什么意思列?如果您只是表示行中的字符数量,只需将该文件分割成多行并检查它们的长度是否等于5.

如果您的意思是使用分隔符的列,那么您应该发现在每一行中的分路器,然后再次检查它们是否等于5.使用fgetcsv

0

您可以尝试查看fgetcsv就足够了。如果没有,请更详细地描述你列出的内容。

0

我假设你在谈论文件中每行的长度。如果是这样,这是一个可能的解决方案。

$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); 
+0

该文件包含巨大的TAB-SEPARATED数据。我使用的是普通的插入这样的: LOAD DATA INFILE CONCURRENT 'C:/test/test.txt的' INTO TABLE huge_dump FIELDS TERMINATED BY '\ t' ENCLOSED BY '\ n' '结尾BY LINES' 忽略1行; 的文件的内容的示例是这样的: ID \t \t 50380294的test.txt \t \t一个12年6月7日19:14 \t 12年6月7日22:00 \t 2时45分42秒 ID 的test.txt 29-06-12 19:34 \t 29-06-12 19:46 \t 0点12分〇〇秒 ID 的test.txt 27-06-12 17:05 \t 27-06-12 20:40 \t 3:35:12 id test.txt \t四\t \t 25-06-12 21:14 \t 1:55:36 – Loyd 2012-08-05 22:56:06

+1

@TendaiGomo:你可以编辑你的原始问题,并添加该信息?这可能会有所帮助。 – Nope 2012-08-05 22:58:28

+0

@TendaiGomo与fgetcsv见我的答案。它应该有你需要的一切。 – 2012-08-05 23:00:00

0

是的,这是可能的。我已经做了确切的事情。使用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页: http://php.net/manual/en/function.fgetcsv.php

下面是函数原型: 阵列fgetcsv($资源手柄[,正如你所看到的,它包含了你所有的东西,包括你想要的东西,在将数据发送到LOAD DATA IN FILE之前,需要使用PHP进行快速扫描。我已经在自己的程序中解决了确切的问题。我的程序也自动消除重复的行和其他很酷的东西。