PHP - 解析具有固定列宽的文本文件

时间:2016-12-01 03:53:57

标签: php database laravel parsing

我是PHP和Laravel的新手,我需要打开文件并解析内容以将它们传递给数据库。文本文件具有固定的列宽。它没有分隔符或标题。我认为使用子字符串并将它们分配给变量将是正确的方法,但我仍然在学习语言,我不知道如何实现它。

以下是文本文件中的数据示例:

1618 0002 9                    1261    4141191269    4141191269       4      002     0

1606 0000 9                    1159    4169191388    4169191388       4      012     0

1607 0009 7    9  505   04129284134          1245          1245 56984 4         

1619 0000 9    6               1172    2129922686    2129922686       4      013     0

1606 0000 9                    1159    4169191388    4169191388       4      012     0

1607 0009 7    9  505   04129284134          1245          1245 56984 4         

1619 0000 7    6  521         1188#          1172          1172       0          001 4

1606 0000 9                    1159    4169191388    4169191388       4      012     0

1607 0009 7    9  505   04129284134          1245          1245 56984 4         

1619 0000 9    6               1252    2129922686    2129922686       4      003     0

1606 0000 9                    1159    4169191388    4169191388       4      012     0

1607 0009 7    9  505   04129284134          1245          1245 56984 4         

1619 0000 7    6  521         1188#          1252          1252       1          002 4

编辑:

列名:

id
time
duration
cond_code
code_dial
code_used
dialed_num
calling_num
clg_num_in_tac
auth_code
frl
ixc_code
in_crt_id
out_crt_id

2 个答案:

答案 0 :(得分:2)

不知道为什么每个人都建议使用解析制表符分隔文件的方法。使用unpack()。我曾经通过手动解析文件和编写函数来提取数据来做到这一点,这很浪费时间。我发现了这个article,它说明了如何以一种干净的自我记录方式进行操作。

$records[] = unpack('A40Address 1/A40Address 2/A25City/A2State/A10Zip Code',$row);

答案 1 :(得分:0)

使用文件和Laravel集合:

Route::get('/import', function()
{
    $lines = collect(file(__DIR__.'/file.txt'))->map(function($item) {
        return explode("\t", $item);
    });

    dd($lines);
});

鉴于此,制表符分隔,文件:

1618    0002    9   1261    4141191269  4141191269  4   002 0
1606    0000    9   1159    4169191388  4169191388  4   012 0
1606    0000    9   1159    4169191388  4169191388  4   012 0

你应该得到像

这样的东西

enter image description here