问题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
答案 0 :(得分:1)
我会说通过文件处理函数执行此操作有点笨拙,因为它可以通过正则表达式很容易地完成。只需使用file_get_contents()
将整个文件读成字符串,并使用/^(([^|]*\|){47}([^\r\n]*))/m
和preg_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()
即可。它返回从当前文件指针位置到它到达行尾的所有内容(并且还返回行字符的结尾)。在函数调用之后,文件读取指针已移动到下一行的开头。