全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1977
推到 Plurk!
推到 Facebook!

如何取得不規則的文字資料

答題得分者是:st33chen
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-11-23 11:37:22 IP:59.114.xxx.xxx 訂閱
我想請問一下
如何取出有不規則空白來區隔的文字資料呢?
我有一個文字檔案
裡面都是英文字
簡單的說
都是一些句子
但是它們句子與句子之間
都是以不規則的空白來做區隔
----------------------
舉例來說~
i love you this is a book a great of as soon as...
i love you<四個空白>this is a book<八個空白>a great of<九個空白>as soon as...

想要取出的資料為:
i love you
this is a book
a great of
as soon as...
----------------------
我要取出每句的英文文字資料
但是要怎麼排除掉這些不規則的段資料呢??
因為每一句的英文都有自己本身的空白
所以小弟不太知道要怎麼去分開取出
而且又不會去刪到每句本身的空白
請問有比較好的方法來取得資料嗎?
編輯記錄
老大仔 重新編輯於 2008-11-23 11:38:47, 註解 無‧
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-11-23 13:08:39 IP:122.116.xxx.xxx 未訂閱
您好,

如果
1. 短句中 字與字 間的空格只有一個(如: this空格is空格a空格book)
2. 短句與短句間至少兩個空格


mylist : tstringlist;

mylist := tstringlist.create;
mylist.text := stringreplace(您的字串,' ', #13#10, [rfreplaceall]); // stringreplace(您的字串, 兩個空格, #13#10, [rfreplaceall])
for ii := 0 to mylist.count-1 do mylist.strings[ii] := trim(mylist.strings[ii]); // 清掉兩個以上的空格

每個 mylist.strings[ii] 就是您想切出來的短句

參考一下.
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2008-11-23 13:09:43, 註解 無‧
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-11-23 14:05:09 IP:220.140.xxx.xxx 訂閱
謝謝st33chen大大的指導
另外我想再請問兩個問題

1.假如資料是沒有任何斷行也可以嗎?(我的文字檔裡完全沒有enter所做出的斷行)
2.memo的載入檔案最大能到多大呢?
因為我的文字檔檔案有3.36mb
在載入的時候一直載不進來
只有第一行的文字有載進來
其他的都沒有載進來
而且我換了RichEdit的時候
也是一樣
請問為什麼會這樣呢?
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-11-23 17:33:56 IP:122.116.xxx.xxx 未訂閱
您好,

1. 沒有 crlf 也可以
2. delphi 文件說 一個字串可到 2g, tmemo.text 本身是一個字串, 照理也可以到 2g
但聽說仍受限於 os, win9x 只到 64k, winxp 我還沒找到資料, 不過若您實測不能超過 64k 的話
那應該 xp 下也是 64k 吧

建議可以
用 file i/0 中的 blockread 函數分段讀入分段處理



===================引 用 老大仔 文 章===================
謝謝st33chen大大的指導
另外我想再請問兩個問題

1.假如資料是沒有任何斷行也可以嗎?(我的文字檔裡完全沒有enter所做出的斷行)
2.memo的載入檔案最大能到多大呢?
因為我的文字檔檔案有3.36mb
在載入的時候一直載不進來
只有第一行的文字有載進來
其他的都沒有載進來
而且我換了RichEdit的時候
也是一樣
請問為什麼會這樣呢?
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2008-11-23 17:34:29, 註解 無‧
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-11-23 21:18:16 IP:59.114.xxx.xxx 訂閱
關於第二點
我有試圖直接在屬性裡(string)貼到memo中
結果也只是貼了一點點而已
無法全部貼上
而換了RichEdit後(也是用貼上的方法)
整個就當掉了
要過了很久才有反應
後來又用了TStringList來載入
也是沒辦法全部載入
我所使用的系統是win2000 Delphi7
您最後提的"用 file i/0 中的 blockread 函數分段讀入分段處理"
請問要怎麼做呢?
小弟不太了解
and還有別的方法可以處理嗎?


===================引 用 st33chen 文 章===================
您好,

1. 沒有 crlf 也可以
2. delphi 文件說 一個字串可到 2g, tmemo.text 本身是一個字串, 照理也可以到 2g
但聽說仍受限於 os, win9x 只到 64k, winxp 我還沒找到資料, 不過若您實測不能超過 64k 的話
那應該 xp 下也是 64k 吧

建議可以
用 file i/0 中的 blockread 函數分段讀入分段處理



===================引 用 老大仔 文 章===================
謝謝st33chen大大的指導
另外我想再請問兩個問題

1.假如資料是沒有任何斷行也可以嗎?(我的文字檔裡完全沒有enter所做出的斷行)
2.memo的載入檔案最大能到多大呢?
因為我的文字檔檔案有3.36mb
在載入的時候一直載不進來
只有第一行的文字有載進來
其他的都沒有載進來
而且我換了RichEdit的時候
也是一樣
請問為什麼會這樣呢?
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-11-24 09:07:31 IP:122.116.xxx.xxx 未訂閱
您好,

blockread 是 針對 binary file 的處理, 若真要用還要轉一下型.
所以我用別的方法, (是一個土方法, 一次讀一個字元), 試了一下, 可行

procedure TForm1.Button1Click(Sender: TObject);
const
BlockSize = 10000;

var
myFile : textFile;
astr, bstr : string;
ii, readcnt, jj : integer;
mylist : tstringlist;
letter : char;
F : File;
buf : Array[0..BlockSize] of Char;
begin
readcnt :=10; // 分段字元數,
// 因為您說整個檔案無 crlf, 所以用 read 而不能用 readln,
// 又因我測試用小檔, 所以數字放小, 代表一次處理多少個字元
// 您可以放大一點, 例如 10000
mylist := tstringlist.Create;
AssignFile(myFile, 'c:\test\Test.txt');
Reset(myFile);
bstr := '';
while not eof(myfile) do begin
ii :=0;
w h i l e ( i i < r e a d c n t ) a n d ( n o t E o f ( m y F i l e ) ) d o b e g i n // 讀如您所指定的字元數
Read(myFile, letter);
bstr := bstr letter;
ii := ii 1;
end;
// 切出短句
jj := pos(' ',bstr);
while jj>0 do begin
astr := trim(copy(bstr,1,jj-1)); // 因 debug 用此句, 可以簡化成 mylist.add(trim(copy(bstr, 1, jj-1)));
mylist.add(astr);
bstr := trimleft(copy(bstr, jj 2,readcnt));
jj := pos(' ',bstr);
end;
end;
if bstr<>'' then mylist.add(bstr); // 最後一句
CloseFile(myFile);
// 切出來的短句放在 mylist, 看您再如何處理
end;

==============================================================
blockread 法 :

AssignFile(myFile, 'c:\test\Test.txt');
Reset(myFile);
改成
AssignFile(F, 'c:\test\test.txt');
Reset(F, 1);

ii :=0;
w h i l e ( i i < r e a d c n t ) a n d ( n o t E o f ( m y F i l e ) ) d o b e g i n // 讀如您所指定的字元數
Read(myFile, letter);
bstr := bstr letter;
ii := ii 1;
end;
改成
BlockRead(F, buf, BlockSize, readcnt);
bstr := strpas(buf);
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2008-11-24 10:29:20, 註解 無‧
st33chen 重新編輯於 2008-11-24 10:31:00, 註解 無‧
st33chen 重新編輯於 2008-11-24 10:33:04, 註解 無‧
st33chen 重新編輯於 2008-11-26 13:27:27, 註解 無‧
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-11-25 22:47:04 IP:59.114.xxx.xxx 訂閱
嗯嗯~~大大您的方法小弟我會再試看看
並try一下有沒有別的方法
暫且先結案~
謝謝您的指教
系統時間:2024-05-16 1:46:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!