【问题标题】:PHP - Parse text file with fixed column widthPHP - 解析具有固定列宽的文本文件
【发布时间】:2017-04-15 14:27:09
【问题描述】:

我是 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

【问题讨论】:

  • 这是一次性插入还是正在进行的 laravel 项目的一部分?你知道列名吗?可以分享相关的数据库列名吗?
  • 听起来你有基础,所以写一些代码。
  • 这是一个正在进行的 laravel 项目。我编辑了原始帖子并添加了列名。
  • 这可能会有所帮助:w3schools.com/php/php_file_open.asp
  • 一旦你得到数据,然后用新行'\n'分割行,'\t'分割单元格,以便得到一个包含数据的数组

标签: php database laravel parsing


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    使用文件和 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
    

    你应该得到类似的东西

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      相关资源
      最近更新 更多