手动将fgetc文件指针移动到下一行

时间:2011-03-15 15:57:45

标签: php fgetc

问题1: 如何手动将fgetc文件指针从当前位置移动到下一行?

我逐个字符地读取数据,直到计算出指定数量的分隔符。一旦分隔符计数达到一定数量,它就需要复制该行的其余部分直到一个新行(记录分隔符)。然后我需要从下一条记录开始逐个字符地再次复制。

问题2: 是否手动将文件指针移动到下一行正确的想法?我只是爆炸(在“\ n”),但我必须首先计算管道分隔符,因为“\ n”并不总是记录分隔符。

这是我的代码(它将所有数据放入正确的记录,直到它到达记录中的最后一个分隔符'|'。然后它将剩余的行放入下一条记录,因为我还没弄明白如何在指定#of |之后正确查找'\ n':

$file=fopen("source_data.txt","r") or exit ("File Open Error");
$record_incrementor = 0;
$pipe_counter = 0;

while (!feof($file))
    {
        $char_buffer = fgetc($file);
        $str_buffer[] = $char_buffer;

            if($char_buffer == '|')
            {
                $pipe_counter++;
            }
            if($pipe_counter == 46) //Maybe Change to 46
            {   
                $database[$record_incrementor] = $str_buffer;
                $record_incrementor++;
                $str_buffer = NULL;
                $pipe_counter = 0;
            }


    }

示例数据:

1378|2009-12-13 11:51:45.783000000|"Pro" |"B13F28"||""|1||""|""|""|||False|||""|""|""|""||""||||||2010-12-15 11:51:51.330000000|108||||||""||||||False|""|""|False|""|||False
1379|2009-12-13 12:23:23.327000000|"TLUG"|"TUG"||""|1||""|""|""|||False|||""|""|""|""||""||||||1943-04-19 00:00:00|||||||""||||||False|""|""|False|""|||False

3 个答案:

答案 0 :(得分:1)

我会说通过文件处理函数执行此操作有点笨拙,因为它可以通过正则表达式很容易地完成。只需使用file_get_contents()将整个文件读成字符串,并使用/^(([^|]*\|){47}([^\r\n]*))/mpreg_match_all()这样的正则表达式可以找到所有行(然后您可以explode()使用{{ 1}}作为分隔符,设置48作为字段数的限制。

这是一个工作示例函数。该函数将文件名,字段分隔符和每行的字段数作为参数。该函数返回2维数组,其中第一个索引是数据行号,第二个索引是字段号。

|

(注意:这是对原始问题的解决方案)

答案 1 :(得分:1)

你可以像这样读到行尾:

while (!feof($file) && fgetc($file) !== '\n');

至于fgetc是否是正确的方法......你的格式使其他任何东西都难以使用。您无法拆分\n,因为字段中可能有换行符,并且您无法拆分|,因为记录的末尾没有管道。

我能想到的唯一其他选择是使用preg_match_all

$buffer = file_get_contents('test.txt');
preg_match_all('/((?:[^|]*\|){45}[^\n]*\n)/', $buffer, $matches);
foreach ($matches[0] as $row) {
  $fields = explode('|', $row);
}

答案 2 :(得分:1)

回答修改后的问题:

要从文件指针读取到行尾,只需使用文件读取功能fgets()即可。它返回从当前文件指针位置到它到达行尾的所有内容(并且还返回行字符的结尾)。在函数调用之后,文件读取指针已移动到下一行的开头。