【问题标题】:how to import data from text file without any delimiter or separator?如何从没有任何分隔符或分隔符的文本文件中导入数据?
【发布时间】:2014-11-18 06:34:42
【问题描述】:

我必须使用 php 代码从文本文件中将数据导入 mysql,是的,这听起来很简单,而且我之前已经完成了这项任务,例如从 csv 文件、excel 文件或任何文本文件中导入数据数据用任何分隔符分隔。但在我目前的情况下,没有任何分隔符,只有两个空格和字段的固定长度。例如-

table field
|------|-----------|-----------|-------------|
| id(8)| name(50)  | state(15) | category(10)| 
|------|-----------|-----------|-------------|
|      |           |           |             | 

upload.txt 文件样本数据-

::格式::

ID 名称地址类别

10719922  Union Bank of India                                 delhi            normal      
10719956  State Bank of India                                 mumbai           normal      
10719522  HDFC Bank                                           gujrat           high        
10759924  ICICI Bank                                          goa              normal      

现在你可以理解文本文件的数据格式了,即字段长度+两个空格,字段长度+两个空格等等。问题是如果数据与字段大小不匹配,那么空格又是用来完成字段长度的,这就是为什么两个空格不能用作分隔符的原因。就像数据中的第一个 - id 有 8 位数据,而不是两个空格,名称长度为 50,但数据只有 19 个字符,所以在这两个空格之后有 31 个空格来完成长度 50,然后是下一个字段。所以我没有分隔符或语法(而不是长度 + 2 个空格)来识别单个字段数据。我很困惑如何使用 php 脚本将这些数据导入 MySQL。有没有人认为它会发生。请我需要一些想法或 php 代码来处理这种情况。谢谢你

【问题讨论】:

    标签: php mysql text import


    【解决方案1】:

    应该不会比这更困难:

    <?php
    $input = <<<END
    10719922  Union Bank of India                                 delhi            normal    
    10719956  State Bank of India                                 mumbai           normal    
    10719522  HDFC Bank                                           gujrat           high    
    10759924  ICICI Bank                                          goa              normal    
    END;
    
    $def = array(
        "id" => 8,
        "name" => 50, 
        "state" => 15, 
        "category" => 10
    );
    
    foreach (explode(PHP_EOL, $input) as $line) {
        foreach ($def as $field => $length) {
            $value = substr($line, 0, $length + 2); 
            $line = substr($line, $length + 2); 
    
            print $field.' = '.trim($value).PHP_EOL;
        }   
    
        print '----------------------------------------'.PHP_EOL;
    } 
    ?>
    

    基本思想是在$def哈希中创建一个格式定义,然后根据该格式定义处理所有行。

    执行此代码将产生以下输出。更改实际实现以满足您的需求。

    id = 10719922
    name = Union Bank of India
    state = delhi
    category = normal
    ----------------------------------------
    id = 10719956
    name = State Bank of India
    state = mumbai
    category = normal
    ----------------------------------------
    id = 10719522
    name = HDFC Bank
    state = gujrat
    category = high
    ----------------------------------------
    id = 10759924
    name = ICICI Bank
    state = goa
    category = normal
    ----------------------------------------
    

    【讨论】:

    • 谢谢罗比,惊人的解决方案。我在您的代码的帮助下完成了这项工作。
    【解决方案2】:

    您可以使用preg_split() 函数,并通过&gt;= 2 spaces 分解字符串/行/行:

    $line = '10719922  Union Bank of India                                 delhi            normal';
    $m = preg_split('~(\h{2,})~', $line);
    print_r($m);
    

    demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-29
      • 2018-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-01
      • 1970-01-01
      • 2013-04-14
      相关资源
      最近更新 更多