正在分析制表符分隔的文件,然后分析生成的数组


Parsing tab delimited file then resulting array

我有一个制表符分隔的文件,我正在解析它,然后我需要解析得到的数组。

这就是我解析文件的方式:

$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东西