2013-06-11 53 views
1

我试图导入一个非csv数据文件到MySQL中。Mysql导入带有字段标识符的非csv数据

1)数据字段为换行符分隔符,字段标识符位于每行的起始位置。

2)一些字段具有多个条目的

3)不是每一个记录都有填充每个字段

4)一些空白行内的字段存在,并且需要被过滤掉

5)记录是一般用空行分隔,但也用“数字X”表示

这里是一个文件的例子,显示了三个记录出现的例子

Number 1 
ARTIST BOOM JEFF=SINGER 
    BACKING MUSICIANS=BAND 
COMP BOOM JEFF 
DATE 1980 
TIME 3.23 
FIELD3 FRONT ROW 
NOTE LIVE RECORDING 


Number 2 
ARTIST JOHN LEE=VOCAL 
COMP JOHN LEE 
TIME 4.20 
ID 000000230682 
PUBLISHER BLAHBLAH 
FIELD3 DAY I RODE THE TRAIN 

Number 3 
ARTIST BURT DAN=NARRATOR 
    JOHNS RY=DRUMS 
    STUDIO BAND=ORCHESTRA 
    FREE DAN=DIRECTOR 
COMP JOHNS RY 
DATE 1934 
DUR 2.32 
ID 000055332 
PUBLISHER WEEWAH 
SHELF 86000002 
FIELD3 EVE OF THE WAR 
NOTE FROM HE NARRATION "NO MORE THAT IN 

     THE FIRST YEARS OF THE SEVENTEENTH CENTURY .." 

将此数据导入MySQL的最佳方式是什么?

可以使用LOAD DATA INFILE来读取它吗?或者我应该编写一个脚本来剥离字段标识符并将其转换为可以使用LOAD DATA INFILE读入的csv格式?

+0

这是哪里的?那是md3/id3标签还是其他一些“众所周知”的格式?那么尝试将其转换为适当的csv然后将其加载到数据库会容易得多? –

+0

这是一种专有格式,所以比标准格式中存在的数据更多。 –

回答

0

从我所看到的,最好的办法是,将通过符合类似以下内容(使用PHP)的脚本解析数据线的脚本:

$lines=explode("\n",file_get_contents('file.name')); 

$record=null; 
//go through all the lines 
foreach($lines as $line) { 
    //if the line is not empty, add the field to the record 
    if(trim($line)) { 
    //I am only processing the field name-you'll have to do the same for equal signs 
    $pos = strpos($line, ' '); 
    $fieldName=substr($line,0,$pos; 
    $fieldValue=substr($line,$pos+1); 
    $record[$fieldName]=$fieldValue; 
    } 
    //if it is a blank line and we have a record, save it 
    else if ($record) { 
    //insert the record into the database 
    insertRecord($record); 
    //empty the record as the next line is a new record 
    $record=null; 
    } 
} 

function insertRecord($record) { 
//to do implement an sql insert statement 
} 
+0

谢谢。一个好的开始。 –

1

我宁愿用sed那些转换为INSERT .. SET ...之类的语句:

INSERT INTO RECORDS SET 
ARTIST="BOOM JEFF=SINGER~BACKING MUSICIANS=BAND" , 
COMP="BOOM JEFF" , 
DATE="1980" , 
TIME="3.23" , 
FIELD3="FRONT ROW" , 
NOTE="LIVE RECORDING" 

在记录新行与~例如和分析数据与SQL的帮助后更换。

+0

这会工作,但Youn Elan的答案似乎更优雅 –