2014-09-05 47 views
-1

我有一个制表符分隔文件,我解析,然后我需要解析结果数组。解析制表符分隔文件,然后结果数组

这是我如何解析文件:

$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] => [email protected] [2] => Date [3] => 01/01/1985) 

我如何解析呢?我正在尝试以下,但它产生一个空白页。

foreach($array as $a) { 
    echo $a.'<br>'; 
} 

我很新的数组,但可以清楚地看到什么都没有引号引起来,我猜是造成了我的问题。在解析制表符分隔文件的过程中是否应该添加引号?如果是这样如何?

回答

0

的问题可能是你的!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... 

最好的办法是建立一个二维数组:

$array = array(); 
while(...) 
    $array[] = $lineAsArray; 

这是伪代码,因为你有的while循环可以简化很多
为什么不使用the fgetcsv function自定义分隔符?

$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事情

相关问题