如何从没有任何分隔符或分隔符的文本文件导入数据?

时间:2014-11-18 06:34:43

标签: php mysql text import

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

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

upload.txt文件的示例数据 -

::格式:

ID NAME ADDRESS CATEGORY

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

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

2 个答案:

答案 0 :(得分: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
----------------------------------------

答案 1 :(得分:0)

您可以使用preg_split()函数,并按>= 2 spaces分解字符串/行/行:

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

demo