線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1587
推到 Plurk!
推到 Facebook!

如何把資料分開 !?

答題得分者是:Coffee
UB
一般會員


發表:18
回覆:19
積分:7
註冊:2007-02-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-03-19 00:00:24 IP:211.76.xxx.xxx 訂閱
小弟今天的問題在這邊不曉得找不找的到答案,因為這個問題和 Delphi 基本上沒有什麼太大的關聯,不過還是很希望能夠找到可以幫我的大大 ~

我有一個銷售的檔案,他是一個 txt 檔,每天我都必須把txt檔案裡面的資料分析過,然後塞到資料庫裡面(mysql),其實基本上都已經完成了,可是有一些小小的問題,就是這個txt檔案其實資料並不是很一致化,不過大部分都有一致,這個txt檔案的內容大概是如下面:


代碼 名稱 日期 進價 賣價 進貨量 銷售量 庫存量

1102 豆芽 960318 3.25 9.00 100 97 6

1103 菠菜 960318 5.50 12.00 60 57 4

1355 可口可樂 960318 23 32 10000 7524 6005

1355A 可口可樂 櫻桃 960318 22 32 2000 408 5410

3152 魚 缸 960318 145 350 30 5 27

3511 螢幕 A級 960318 3200 4800 10 2 15

4700 電池 2號 960318 7.50 20 120 94 60


基本上txt的內容大概像是上面的那樣子,有幾個重點:

1.基本上一列都是八個欄位。

2.除了代碼和名稱之外其他的資料都是數字的

3.代碼絕大部分都是數字,可是也有少部份是數字和英文字混合的,也有只有英文字的。

4.名稱方面比較糟糕,例如『魚缸』這個東西,他的名稱中間就夾帶了空白,有時候夾帶數字,有時候夾帶英文字,有時候全部混著




我的作法是:

1.把檔案讀近來

2.while not eof(xx) do 把一列一列用 readln 讀進一個字串

3.把這個字串的資料一個一個分開(問題就是出在這裡了),我在 ktop 裡面搜尋了好久,終於找到一個可以用的方法(如下),然後再把TStringList 裡面的東西用 for 一個一個讀出來,加上 if 作基本的判斷,然後把資料讀進去 data:array[0..7] of string 裡面。


function SplitString(S, Delimiter: string): TStringList;

begin

// 分割字串

Result := TStringList.Create;

Result.Text := StringReplace(S, Delimiter, #13, [rfReplaceAll]);

end;



(對不起,我真的很想把原來的出處也連結近來,對作者表示尊重,可是我剛剛努力的在重新找過,真的找不到原來的文章了,但是我確定是ktop 的大大做的程式碼)


這個方法有個問題就是,例如『魚 缸』這個東西,他中間有空格,所以他分成了兩行,也就是資料就會亂掉了。

所以我又換了另一個作法,就是用 regular expression 來把資料分開

基本上我的問題就是.... 這個的regular expression 該怎麼寫才可以,因為他有中文字在裡面,我對於 regular expression 也是新手,昨天讀了一整天關於這類的資料,還不是很熟悉,不過我目前可以用最簡單的 regular expression 把所有的數字抓出來,但還是有一堆的問題,真的要請教各位大大,這個的regular expression 該如何作 !! ps. 我用的是 DIRegEx 的 好像是 perl 的語法,他還寫什麼PCRE 我就不清楚那代表什麼了


ps. 我目前的作法是在塞進去資料庫之前把全部的資料完整的檢查一次,如果資料沒有問題的話就塞進去,如果有問題的話就紀錄下來然後存成錯誤的log檔案,然後準備用人工慢慢修,可是....這個方法真的很笨,因為除了星期六日休息之外,其他每天都有一個這樣子的檔案,而每天都有5000多筆資料要跑,基本上出錯的資料每個檔案平均大概有將近100筆,所以.....

我把問題簡化一下,就是要把上面(藍色部份)的資料分開的話,regular experssion 該怎麼寫 (該注意的重點我已經用紅色標出來了)!?
編輯記錄
Coffee 重新編輯於 2008-01-08 10:41:55, 註解 修改分類為問題‧
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-03-19 02:29:22 IP:211.74.xxx.xxx 訂閱
問題看起來沒有這麼大吧?
每一行讀進來,
一、固定八個欄位
二、除了第二欄以外不能有空白
三、除了第一行與第二行以外不得有英文

只要讀了第一個欄位之後,再從第八個欄位開始往回讀,最後的欄位就是第二個欄位的?
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
UB
一般會員


發表:18
回覆:19
積分:7
註冊:2007-02-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-03-19 20:24:58 IP:211.76.xxx.xxx 訂閱
coffee 大大的方法真的是一針見血,把我的問題直接解決了,
不過我還是希望能夠知道,如果字串裡面有中文(包括unicode 或 big5),那 regular expression 應該要如何來寫,
因為現在這個問題,可以很容易的使用coffee大大的方法直接解決,但是未來可能還會遇到類似的問題,所以我想趁現在學好 regular expression !!
系統時間:2024-05-03 0:44:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!