如何取得不規則的文字資料 |
答題得分者是:st33chen
|
老大仔
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
我想請問一下
要如何取出有不規則空白來區隔的文字資料呢? 我有一個文字檔案 裡面都是英文字 簡單的說 都是一些句子 但是它們句子與句子之間 都是以不規則的空白來做區隔 ---------------------- 舉例來說~ 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 發送簡訊給我 |
您好,
如果 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 發送簡訊給我 |
|
st33chen
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
您好,
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 發送簡訊給我 |
關於第二點
我有試圖直接在屬性裡(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 發送簡訊給我 |
您好, 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 (滷肉腳啦); 都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲. |
老大仔
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |