0

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

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

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

这是我的代码(它将所有数据放入正确的记录中,直到它到达记录中的最后一个分隔符“|”。然后它将该行的其余部分放入下一条记录,因为我还没有弄清楚如何正确地制作它在指定的 | 计数后查找 '\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
4

3 回答 3

1

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

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

function loadPipeData ($file, $delim = '|', $fieldCount = 48)
{
    $contents = file_get_contents($file);
    $d = preg_quote($delim, '/');
    preg_match_all("/^(([^$d]*$d){" . ($fieldCount - 1) . '}([^\r\n]*))/m', $contents, $match);
    $return = array();

    foreach ($match[0] as $line)
    {
        $return[] = explode($delim, $line, $fieldCount);
    }

    return $return;
}

var_dump(loadPipeData('source_data.txt'));

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

于 2011-03-15T16:29:48.023 回答
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);
}
于 2011-03-15T16:34:08.660 回答
1

回答修改后的问题:

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

于 2011-03-15T16:38:08.470 回答