我有一个制表符分隔的文件,我正在解析它,然后我需要解析得到的数组。
这就是我解析文件的方式:
$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>';
}
我对数组很陌生,但可以清楚地看到引号中没有任何内容,我想这会给我带来问题。在分析以制表符分隔的文件时是否应该添加引号?如果是,怎么办?
问题可能是您使用!feof
:您正在检查是否还没有到达文件的末尾,这很好,但您没有检查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...
你最好的选择是构建一个2D阵列:
$array = array();
while(...)
$array[] = $lineAsArray;
这是伪代码,因为while循环可以简化很多:
为什么不使用带有自定义分隔符的fgetcsv
函数?
$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>
,所以我认为使用implode
更有意义。
我不确定你的文件是什么样子的,但最长的一行可能超过2048字节,你可以利用PHP可以处理0
长度参数的事实。如果长度为零,将读取该行,直到遇到EOL或EOF:
while ($line = fgetcsv($fh, 0, "'t"))
那会很好用的。。。
底线:
我认为你正在寻找一些类似的东西
$fh = fopne('myFile.txt', 'r');
if (!$fh)
exit(1);//handle error
$array = array();
$alternative = array();
while($line = fgetcsv($fh, 0, "'t"))
{
$array[] = $line;
//or if you simply want to echo:
$alternative[] = implode('<br>', $line);
}
//the short alternative
echo implode('<br>', $alternative);
//the long way:
foreach ($array as $line)
{
echo implode('<br>',$line), '<br>';
}
两者都相当于ssame东西