2013-04-24 43 views
1

有一個很長的文字,看起來像這樣:我如何去通過長文本,並將其轉換成Insert語句對MySQL

1 E.M.史密斯,J.P.拉維尼,P. VIALLEFONT等J. DAUNIS。 Recherches ensérietriazépine-1,2,4。 J.Heterocyclic Chem。 12,66(1975)。

2- M. BENCHIDMI et E.M. ESSASSI。 合成雙雙三唑並[4,3-b:4,3-d]三氮雜-1,2,4。 J.Heterocyclic Chem。,13,885(1976)。

3- LAVERGNE et P. VIALLEFONT。 1,5肼基氮雜卓氮雜苯並二氮卓酮和氮雜苯並二氮-硫酮。 Tetrahedron,33,2807(1977)。

4- E.M. ESSASSI。 「Synthèseetétudede RMN1H enprésencede l'Eu(fod)3 des pyrazolo [1,5,4-ef]benzodiazépine-1,5 ones-6 Bull.Soc.Chim.Belg。,96,399( 1987)。

。 。 。 。

並在不斷超過300多,我需要提取每行並將其添加到插入查詢的MySQL中,刪除列表中的數字和逃避所有引號和雙引號,我雖然使用正則表達式,但事實證明對我來說很困難。

插入查詢應該看起來像:

INSERT INTO PUBLICATIONS (NAME,AUTHOR,CITE,PUB_YEAR) VALUES 
("Recherches en série triazépine-1,2,4.", "E.M. Smith, J.P. LAVERGNE, P. VIALLEFONT et J. DAUNIS.","J. Heterocyclic Chem. 12, 66","1975"), 
("Synthèse de bis s-triazolo [4,3-b : 4,3-d] triazépines-1,2,4.", "M. BENCHIDMI et E.M. ESSASSI.","J. Heterocyclic Chem., 13, 885","1976"), 
etc. 

我只是給了一些格式文本有一些想法,但它沒有空格或下一行,它都在一個巨大的字符串。

我還以爲是使用喜歡的事:

$string = "all my string" 
$pattern = '/regex pattern/'; 
$replacement = 'result format'; 
echo preg_replace($pattern, $replacement, $string); 

我意識到,因爲沒有特定的模式,所以我也許可以手動添加\ n \ r分割每行分裂它可能是不可能的

非常感謝!

回答

1

編輯:經過觀察,這種模式可以完成這項工作,但我需要更多的數據來查看所有可能的異常,並更好地理解這種數據的「邏輯」。 (但第一個答案總是一種方式。)

我看到了一些規則:

作者:

  • 與最終與隨後名字
  • 所有作者都用逗號和空格,將分離的forName首字母開始last by〜et〜
  • 以點和空格結尾

標題:

  • 開始用大寫字母與最終形成qouble報價之前
  • 沒有點
  • 並不總是與數字結束:
    • 用逗號之前並帶有點和空格後
    • 或用 - 之前,除非有在年底

    沒有點後

  • 空間引用:

    • 開頭大寫
    • 型動物單詞,大寫第一個字母,可以用點來短接
    • 後面跟着:c omma,空格,數字,逗號空格,空格。

    代碼

    $subject = <<<LOD 
    1- E.M. Smith, J.P. LAVERGNE, P. VIALLEFONT et J. DAUNIS. Recherches en série triazépine-1,2,4. J. Heterocyclic Chem. 12, 66 (1975). 
    2- M. BENCHIDMI et E.M. ESSASSI. Synthèse de bis s-triazolo [4,3-b : 4,3-d] triazépines-1,2,4. J. Heterocyclic Chem., 13, 885 (1976). 
    3- LAVERGNE et P. VIALLEFONT. Hydrazinolyse d'azabenzodiazépinones et d'azabenzodiazépine-thiones de type 1,5. Tetrahedron, 33, 28O7 (1977). 
    4- E.M. ESSASSI. "Synthèse et étude de RMN1H en présence de l'Eu(fod)3 des pyrazolo [1,5,4-ef] benzodiazépine-1,5 ones-6 Bull. Soc. Chim. Belg., 96, 399 (1987). 
    1O- J.M.F. BOURGOIN-DE-LA-VILLARDIERE. Recherches en série triazepine-1,2,4: 1 - détermination de la structure de la triazolotriazépinone obtenue par action de l'acétylacétate d'éthyle sur le diamino-3,4 triazole-1,2,4 J. Heterocyclic Chem., 13, 885 (1976). 
    LOD; 
    $pattern = 
    '~# authors : 
        (?(DEFINE)(?<FN>(?:[A-Z]\.){0,3}+(?(?<=\.)\h))) # ForName 
        (?(DEFINE)(?<NM>[A-Z](?:[A-Z]++|[a-z]++)(?:-[A-Z](?:[A-Z]++|[a-z]++))*+)) # NaMe 
        [O\d]++-\h(?<author>(?&FN)(?&NM)(?>(,\h(?&FN)(?&NM))*+\het\h(?&FN)(?&NM))?+)\.\h 
        # titles : 
        "?+(?<title>[A-Z][^.]+?(?:\.|(?:,|-)\d))\h 
        # cites : 
        (?<cite>(?:[A-Z][a-z]*+\.?+\h)*[A-Z][a-z]*+\.?+,?+\h[O\d]++,\h[O\d]++)\h 
        # date : 
        \((?<date>[^)]++)\) 
    ~x';    
    
    preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER); 
    foreach ($matches as &$match) { //cosmetic 
        foreach ($match as $key=>$value) { 
         if (is_numeric($key)||$key=='NM'||$key=='FN') unset($match[$key]); 
        } 
    } 
    echo '<meta charset="UTF-8"/><pre>' . print_r($matches, true) . '</pre>'; 
    

    - 答案編輯前 -

    哇,你發現有絕對沒有什麼好作者,名稱之間的區別和引用。一種方法是切片(作者,名稱和引用之間的簡單換行符),用手(每行大約5s,在不到30分鐘內完成,toutouyoutou :)。

    我說,因爲我看到作者,姓名和引用之間唯一的區別是無法與正則表達式匹配的感覺。

    如果你使這個rebarbative工作,它會很容易進行sql查詢。例如:

    1- E.M. Smith, J.P. LAVERGNE, P. VIALLEFONT et J. DAUNIS. 
    Recherches en série triazépine-1,2,4. 
    J. Heterocyclic Chem. 12, 66 (1975). 
    

    這就是所有,不需要觸摸數字或日期,正則表達式可以完成這項工作。 如果你做這個工作,編輯你的消息,以幫助正則表達式。

  • +0

    太糟糕了,E.M.史密斯沒有被寫成史密斯。在這種情況下,可以將作者分開,因爲它們全部以表格(((((INITIAL DOT)+ CAPITALISED_WORD_AS_NAME),)+ et)((INITIAL DOT)+ CAPITALISED_WORD_AS_NAME))...; )但事實上,它更好地手工分割它,知道你做了什麼。 – SWilk 2013-04-24 08:58:06

    +0

    我已經找到了所有領域的臨時解決方案,但是我需要大量的數據來處理這些錯誤。我要編輯我的文章。 – 2013-04-24 10:12:02

    +0

    謝謝!我在答覆的底部說過,我可以在每行添加中斷以將作者從文章中分離出來,因此每個條目總是有4行,手動需要5分鐘,我想這會有所幫助:)謝謝。 – multimediaxp 2013-04-24 12:20:04