我有一个以制表符分隔的文件,我正在解析,然后我需要解析生成的数组。
这就是我解析文件的方式:
$fp = fopen('myFile.txt', 'r');
while ( !feof($fp) )
{
$line = fgets($fp, 2048);
$delimiter = "\t";
$array = str_getcsv($line, $delimiter);
}
要检查数据,我尝试print_r($array);
,例如:
Array ( [0] => Customer Name [1] => Customer Email [2] => Date [3] => Test Date)
Array ( [0] => John Smith [1] => john@gmail.com [2] => Date [3] => 01/01/1985)
我该如何解析这个?我尝试以下操作,但它会生成一个空白页。
foreach($array as $a) {
echo $a.'<br>';
}
我对数组很新,但可以清楚地看到引号中没有任何内容,我猜这会引起我的问题。是否应在解析制表符分隔文件期间添加引号?如果是这样的话?
答案 0 :(得分:0)
问题可能是你使用!feof
:你正在检查你是否还没有到达文件的末尾,这很好,但你没有检查{{1的返回值}}。文件中的最后一行通常只是一个换行符,所以在最后一次迭代中,fgets
最终不是一个空字符串。
您还要重新分配$line
,每次都会替换您分配给它的先前值。如果您发布的循环位于$array
循环的外,那么您所做的实际上并不是这样的:
while
如果你试图翻过这个空数组,你就不会回应任何东西:
$line = '';//as explained, $line might be an empty string
$array = str_getcsv($line, "\t");//which is $array = array();
你最好的办法是建造一个二维阵列:
foreach (array() as $a)
echo $a;//there are no values to echo...
这是伪代码,因为你的while循环可以简化很多:
为什么不将the fgetcsv
function与自定义分隔符一起使用?
$array = array();
while(...)
$array[] = $lineAsArray;
这就是全部。而不是$fh = fopen('myFile.txt', 'r');
if (!$fh)
exit(1);//handle error
while ($line = fgetcsv($fh, 2048, "\t"))
{//line is an array of CSV values now
echo implode('<br>', $line), '<br>';//echo all values
}
你可以循环上线,但看到你只是回显所有值,然后是implode
,我认为使用<br>
更有意义。
我不确定您的文件是什么样的,但最长的行可能超过2048字节,您可以利用PHP可以处理{{1}的事实长度参数。如果长度为零,则将读取该行,直到遇到EOL或EOF:
implode
那会很好......
底线:
我认为你正在寻找类似的东西:
0
两者都等于ssame的事情