2011-12-29 50 views
6

我試圖幫助我的父親 - 他給了我一個從他的工作調度應用程序出口。我們正試圖查看我們是否可以將其導入到mysql數據庫中,以便他/他們的同事可以在線進行協作。解析一個非常忙碌的空間分隔文件

我已經嘗試了很多不同的方法,但沒有一個看起來沒有問題 - 這不是我的專業領域。

出口可以在這裏看到:http://roikingon.com/export.txt

上如何去分析這個任何幫助/建議將不勝感激!

謝謝!

+0

建議......好的,你應該知道該輸出的數據格式。此外,地址是空格分隔的,列之間沒有標籤 - 它似乎缺少一些自動解析的信息。 – alxx 2011-12-29 05:29:58

+2

我的猜測是:它的寬度是固定的,前3個字符是記錄類型。每種記錄類型都有相同的格式(這意味着記錄類型4的每一行都有相同的兩列,記錄類型17.1只有一列,但它似乎開始一個新的「路由塊」)。 – vstm 2011-12-29 05:34:20

+2

糟糕的表單不包括你的數據內聯。現在鏈接已經死了,所以不可能將你的問題置於背景之中。或者使用pastebin等...只是說... – ftrotter 2014-06-14 00:55:03

回答

2

我試圖編寫一個(有些動態的)固定列解析器。看看:http://codepad.org/oAiKD0e7(它太長了,但它主要是「數據」)。

我已經注意到

  • 文本數據與填充右側像"hello___"_ =空間)
  • 數值數據是正確與左"___42"
填充左對齊排列

如果你想使用我的代碼還有些事情要做:

  • 記錄類型12.x有可變的列數(在一些靜態列之後),你必須爲它實現另一個「處理程序」
  • 我的一些寬度很可能是錯誤的。我認爲有一個系統(像數字是4個字符長,文字8個字符長,在特殊情況下有一些變化)。具有領域知識和多個樣本文件的人可以找出列。
  • 獲取原始數據只是第一步,您必須將原始數據映射到某個有用的模型並將該模型寫入數據庫。
+0

Ha!我其實是在做同樣的事情。我做了一點不同的壽。我使用了一個開關,而不是一個具有返回每行數據數組的函數的大型數組。 好東西! – Roi 2011-12-30 02:57:29

1

您可以使用正則表達式(零個或多個空格)進行拆分。

我會盡力讓你知道。

似乎沒有與您的數據結構。

$data = "12.1 0 1144713  751 17 Y 8 517 526 537 542 550 556 561 567          17 "; 

$arr = preg_split("/ +/", $data); 
print_r($arr); 

Array 
(
    [0] => 12.1 
    [1] => 0 
    [2] => 1144713 
    [3] => 751 
    [4] => 17 
    [5] => Y 
    [6] => 8 
    [7] => 517 
    [8] => 526 
    [9] => 537 
    [10] => 542 
    [11] => 550 
    [12] => 556 
    [13] => 561 
    [14] => 567 
    [15] => 17 
    [16] => 
) 

試試這個preg_split("/ +/", $data);這是零個或多個空格分割線,那麼你將有一個很好的數組,你可以處理。但是看看你的數據,沒有結構,所以你將不得不知道哪個數組元素對應於什麼數據。

祝你好運。

+0

嘿 - 這是我的第一個想法..並開始實施,但後來意識到這被認爲是「列分隔」,這意味着可能會有空記錄,這樣做會跳過那些記錄。我找到了一個PDF,有點解釋了發生了什麼,並在其中......它包括一個字段長度。使用該字段的長度,我可以使用substr($ row,$ column-position,$ field-length) – Roi 2011-12-29 07:41:20

+0

就像我說的祝你好運。解析這種有用的數據非常困難。 – DarthVader 2011-12-29 08:12:19

1

用excel打開並保存爲逗號分隔。將連續的分隔符視爲一個,否則。然後使用excel作爲csv重新保存,這將以逗號分隔,並且更容易導入到mysql。

編輯: 誰說在[+]上使用preg_split的人給出的答案基本上與我上面做的一樣。

問題是在那之後要做什麼。

您是否確定了有多少「行類型」?一旦確定並定義了它們的特徵,編寫一些代碼來完成它會容易得多。

如果將其保存爲csv,則可以使用PHP fgetcsv函數和相關函數。對於每一行,您都會檢查它的類型並根據類型執行操作。

我注意到您的數據行可能可以分爲第一列的數據是否包含「。」。所以這裏有一個如何循環訪問文件的例子。

而($行= fgetcsv($ file_handle)){ 如果(strpos($行[0], '')===假){// 做一些 }其他{// 做別的 } }

「做什麼」 會是這樣的 「CREATE TABLE table_$row[0]」 或 「INSERT INTO table」 等

好了,和這裏的一些觀察:

您的文件[R最終像多個文件粘在一起。它包含多種格式。請注意,所有以「4」開頭的行都有一個由4個字母組成的公司縮寫,後面是完整的公司名稱。其中之一是「caco」。如果您搜索「caco」,則可以在文件中的多個「表格」中找到它。

我也注意到「smuwtfa」(星期幾)灑在身邊。

使用這樣的線索來確定如何處理每一行的邏輯。

+1

如果仔細查看該文件,您會發現這不是轉換爲CSV的簡單方法。其中包含的數據比這要複雜得多。它會/將需要反向工程,解析並導入到許多不同的表中。 – 2011-12-29 05:37:08

+0

甚至很難說出數據結構是什麼。如果您實際發佈了需要解碼的結構的摘要,那將會更有用。 – 2011-12-29 06:56:39

+0

我似乎已經能夠使用substr做到這一點,並按照每個部分的格式 – Roi 2011-12-29 07:46:21

2

使用該文件結構,您基本上需要對專有格式進行反向工程。是的,這是空格分隔,但格式不符合任何類型的標準,如CSV,YAML等。它是完全專有似乎是一個標題和獨立的部分與他們自己的標題。

我認爲你最好的選擇是嘗試看看是否有其他類型的導出可以完成,例如Excel或XML並從那裏開始工作。如果沒有,那麼看看是否有某種可以屏幕抓取的html輸出,並粘貼到Excel中並看到你得到了什麼。

由於我上面提到的所有內容,按照當前形式的文件很難將其按照合理的方式導入到數據庫中。 (請注意,從文件結構中需要多個表格。)