在将数据转储到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
答案 0 :(得分: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
}
如果任何行的长度超过$ max_cols,则此代码读取文件,逐行说“myfile.txt”,并将变量$ 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
}
答案 1 :(得分:2)
我知道这是一个老话题,但是我一直在寻找类似的东西,因此遇到了这个话题,但是这里提供的答案都没有帮助我。
因此,我继续前进,并提出了自己的解决方案,该解决方案已经过测试并且可以完美运行(可以改进)。
假设,我们有一个名为example.csv
的CSV文件,其中包含以下虚拟数据(故意,最后一行第6行包含一个额外的数据,然后是其他行):
Name,Country,Age
John,Ireland,18
Ted,USA,22
Lisa,UK,23
Michael,USA,20
Louise,Ireland,22,11
现在,当我们检查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'));
答案 2 :(得分:0)
你的意思是什么?如果您只是意味着行中的字符数量,只需将文件拆分(explode
)到多行并检查它们的长度是否等于5.
如果您的意思是带有分隔符的列,那么您应该在每一行中找到该分割器的出现次数,然后再次检查它们是否等于5. 使用fgetcsv
代替 p>
答案 3 :(得分:0)
您可以尝试查看fgetcsv
是否足够。如果没有,请对列的含义更具描述性。
答案 4 :(得分: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);
答案 5 :(得分: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
这是函数原型: array fgetcsv(resource $ handle [,int $ length = 0 [,string $ delimiter =','[,string $ enclosure ='“'[,string $ escape ='\']]]])
正如您所看到的,它具有在将数据发送到文件中的LOAD DATA之前在PHP中进行快速扫描所需的一切。
我已经在我自己的程序中解决了你的确切问题。我的程序还会自动消除重复的行和其他很酷的东西。