2014-03-26 95 views
1

我遇到了一個問題,我不知道如何解決問題。目前我正在閱讀一些文本文件,但是我不想保留一些值。該行是像從Delphi的文本文件讀取行時使用分隔符

INT字符串浮球浮

我只希望有串部分和名稱指定給一個列表框。我嘗試了一個分隔符只是爲了一個空格,但我意識到它不是重置到下一行的開頭,而是繼續從最後一個地方繼續。

文本文件的第一行是

1勿洞1.7 0.24 2300

2 Armerad勿洞1.28 0.26 2100

3 Cementbruk 0.93 0.29 1800

使用帶空格的分隔符給我

Armerad

0.93

雖然我想它至少是

我現在所擁有的代碼是一個onClickEvent一個按鈕

var 
    SomeTxtFile : TextFile; 
    buffer : string; 
    holder : TStringList; 
    idx:integer; 
begin 
idx:=-1; 
    holder:=TStringList.Create; 
    AssignFile(SomeTxtFile, 'Opaque.lib') ; 
    Reset(SomeTxtFile) ; 
    while not EOF(SomeTxtFile) do 
    begin 
    idx:=idx+1; 
    ReadLn(SomeTxtFile, buffer) ; 
    holder.Delimiter:=' '; 
    holder.DelimitedText:=buffer; 
    ShowMessage(buffer) ; 
    WallsListBox.Items.Add(holder[idx]); 
    end; 
    CloseFile(SomeTxtFile) ; 

我在想,也許我可以做我想做的有很多標誌,試圖轉換過程部分字符串浮動/整數,但這似乎很愚蠢。有什麼建議麼?

謝謝!

+0

您添加到列表框持有者[idx]。而且,讀取的每一行都會增加idx。您應該將持有者[0]添加到列表框中。 –

+1

如果你想幫自己一個忙,拋出所有這些TextFile例程,而不是使用流。每次有人使用AssignFile(),一隻小貓死亡。 – JensG

+0

@JensG我不知道如何使用流,所以我很抱歉,但我想我必須是一個小貓兇手:/ – user3464658

回答

2

您正在打印列表的idx'th元素。要打印第一元件,使用

WallsListBox.Items.Add(holder[0]); 

打印第二(串)的一部分 - 使用

WallsListBox.Items.Add(holder[1]); 

等。請注意,字符串部分可能包含一些單詞(Armerad Betong),因此您需要分析holder的內容。例如:

var 
    TextList, Holder: TStringList; 
    s: string; 
    i, j: integer; 
    dummy: Double; 
begin 
    TextList := TStringList.Create; 
    Holder := TStringList.Create; 
    TextList.LoadFromFile('Opaque.lib'); 
    for i := 0 to TextList.Count - 1 do begin 
    Holder.CommaText := TextList[i]; 
    if Holder.Count >= 2 then begin 
     s := Holder[1]; 
     j := 2; 
     while (j < Holder.Count) and 
     (not TryStrToFloat(Holder[j], dummy)) do begin 
     s := s + ' ' + Holder[j]; 
     Inc(j); 
     end; 
     Memo1.Lines.Add(s); 
    end; 
    end; 
    Holder.Free; 
    TextList.Free; 
+0

哦,現在我明白了!謝謝!通過分析持有者的內容,我需要做一些標誌可能是正確的? – user3464658

0

而不是使用的TStringList來「界定」的文本(它不會當有要提取的字符串中的空格工作),我會用另一種方法:刪除上三個單詞和字符串中的第一個單詞(空格分隔)。剩下的一定是你後(假設所有的線條正好包含格式INT字符串浮球浮)文字:

var 
    SomeTxtFile : TextFile; 
    buffer : string; 
    idx:integer; 

begin 
    AssignFile(SomeTxtFile, 'Opaque.lib') ; 
    Reset(SomeTxtFile) ; 
    while not EOF(SomeTxtFile) do begin 
    ReadLn(SomeTxtFile, buffer); 
    ShowMessage(buffer); 
    idx:=length(buffer); 
    // First eliminitate all trailing spaces 
    while buffer[idx]=' ' do dec(idx); 
    // Then eliminate the third float value (search backwards for the space seperator) 
    while buffer[idx]<>' ' do dec(idx); 
    // Then eliminitate all spaces before the third float value 
    while buffer[idx]=' ' do dec(idx); 
    // Then eliminate the second float value (search backwards for the space seperator) 
    while buffer[idx]<>' ' do dec(idx); 
    // Then eliminitate all spaces before the second float value 
    while buffer[idx]=' ' do dec(idx); 
    // Then eliminate the first float value (search backwards for the space seperator) 
    while buffer[idx]<>' ' do dec(idx); 
    // Then eliminitate all spaces before the first float value 
    while buffer[idx]=' ' do dec(idx); 
    // Truncate the string to elimate all the characters we have determined to be the float values and their seperating spaces 
    setlength(buffer,idx); 
    // Now search from the beginning of the string 
    idx:=1; 
    // First eliminate all leading spaces 
    while buffer[idx]=' ' do inc(idx); 
    // Then eliminate the integer value 
    while buffer[idx]<>' ' do inc(idx); 
    // Then eliminate the spaces following the integer value 
    while buffer[idx]=' ' do inc(idx); 
    // We are now at the first character of the string we want, so step back one character 
    dec(idx); 
    // Delete the characters from the string that we have determined to be the integer value and the spaces surrounding it 
    delete(buffer,1,idx); 
    WallsListBox.Items.Add(buffer); 
    end; 
    CloseFile(SomeTxtFile); 
end. 

您還可以使用內置的POS功能,但是我相信上面的代碼比較容易理解,因爲(看起來 - 沒有冒犯性)只有Delphi/PASCAL語言的基本知識。

相關問題