2012-02-05 36 views
0

如何加載帶空格的StringGrid整數的文本文件?每個號碼給每個單元格。電網必須是一個矩形,這樣即使有些號丟失,應填爲0從文本文件加載StringGrid

這裏就是我所做的,到目前爲止,但它需要有已設置的行和列數。

while not eof(f) do 
    begin 
    while not eoln(f) do 
    begin 
     read(f, data); 
     StringGrid1.Cells[p, l] := data; 
     inc(p); 
    end; 
    p := 0; 
    readln(f); 
    inc(l); 
    end; 
+5

你爲什麼使用Pascal IO?爲什麼不只是將文件加載到字符串列表並使用['SplitString'](http://docwiki.embarcadero.com/VCL/en/StrUtils.SplitString)函數來分割每一行? – 2012-02-05 22:58:32

+1

忽略** NO PASCAL I/O **幫派,對於這項任務很好。您的問題陳述不一致,如果多於一個連續的數字缺失,您將如何確定職位? – OnTheFly 2012-02-06 00:30:40

+3

@ user539484純粹的毒液和惡意。沒有優雅。 – 2012-02-06 17:31:31

回答

0

我會建議嘗試這個代碼。
這是基本的,但我相信你可以解決你的問題。

procedure LoadFile(FileName: string; StringGrid: TStringGrid); 
var 
    temp, fName, sName, eMail: string; 
    sgItem: TStringList; 
    f: textfile; 
begin 
    assignfile(f, FileName); 
    reset(f); 
    sgItem := TStringList.Create; 
    StringGrid.RowCount := 2; 
    while not eof(f) do 
    begin 
    readln(f, temp); 
    fName := copy(temp, 1, pos('|', temp) - 1); 
    delete(temp, 1, pos('|', temp)); 
    sName := copy(temp, 1, pos('|', temp) - 1); 
    delete(temp, 1, pos('|', temp)); 
    eMail := temp; 
    sgItem.Clear; 
    sgItem.Add(fName); 
    sgItem.Add(sName); 
    sgItem.Add(eMail); 
    StringGrid.Rows[StringGrid.RowCount - 1].AddStrings(sgItem); 
    StringGrid.RowCount := StringGrid.RowCount + 1; 
    end; 
    sgItem.Free; 
    closefile(f); 
end; 

用法:

LoadFile('File.txt', StringGrid1); 

天語

1

我個人會選擇不使用這裏帕斯卡IO。如果你想讓你的代碼能夠讀取Unicode數據,那麼Pascal IO無法幫助你。

您可以使用字符串列表來加載文件,然後從StrUtils單元執行SplitString來解析字符串。

procedure PopulateStringGrid(Grid: TStringGrid; const FileName: string); 
var 
    Strings: TStringList; 
    Row, Col: Integer; 
    Items: TStringDynArray; 
begin 
    Grid.RowCount := 0;//clear any previous data 
    Strings := TStringList.Create; 
    try 
    Strings.LoadFromFile(FileName); 
    Grid.RowCount := Strings.Count; 
    for Row := 0 to Strings.Count-1 do 
    begin 
     Items := SplitString(Strings[Row], ' '); 
     for Col := 0 to Grid.ColCount-1 do 
     if Col<Length(Items) then 
      Grid.Cells[Col, Row] := Items[Col] 
     else 
      Grid.Cells[Col, Row] := '0'; 
    end; 
    finally 
    Strings.Free; 
    end; 
end; 

請注意,SplitString可能不是你所需要的。例如,它不會將重複的分隔符合併成一個。要明白我的意思考慮以下輸入:

Hello World 

有兩個詞之間的4個空格和SplitString將返回以下陣列:

'Hello' 
'' 
'' 
'' 
'World' 

如果你想將連續分隔符爲剛一個分隔符,那麼你可以使用一個字符串列表DelimitedText屬性:

procedure PopulateStringGrid(Grid: TStringGrid; const FileName: string); 
var 
    TextFile, Line: TStringList; 
    Row: Integer; 
begin 
    Grid.RowCount := 0;//clear any previous data 
    TextFile := TStringList.Create; 
    try 
    Line := TStringList.Create; 
    try 
     Line.Delimiter := ' '; 
     TextFile.LoadFromFile(FileName); 
     Grid.RowCount := TextFile.Count; 
     for Row := 0 to TextFile.Count-1 do 
     begin 
     Line.DelimitedText := TextFile[Row]; 
     for Col := 0 to Grid.ColCount-1 do 
      if Col<Line.Count then 
      Grid.Cells[Col, Row] := Line[Col] 
      else 
      Grid.Cells[Col, Row] := '0'; 
     end; 
    finally 
     Line.Free; 
    end; 
    finally 
    TextFile.Free; 
    end; 
end; 
0

試試這個

procedure FillStringgrid; 
     // Split the line of text into individual entries 
     procedure Split(const Delimiter: Char;Input: string;const Strings:TStrings); 
     begin 
      Assert(Assigned(Strings)) ; 
      Strings.Clear; 
      Strings.Delimiter := Delimiter; 
      Strings.DelimitedText := Input; 
     end; 
    var 
     strlst : Tstringlist; 
     myfile : TextFile; 
     search : string; 
     i,j  : integer; 
    begin 
     i:= 0; 
     AssignFile(myfile,'filepath'); // specify your file path here 
     Reset(myFile); 
     while not eof(myfile) do 
     begin 
      Readln(myfile,search); 
      strlst:= Tstringlist.Create; 
      Split(' ',search,strlst); // get the no's separated by the delimiter 
      //adjust your column count based on no of entries 
      if StringGrid1.ColCount < strlst.Count then 
      StringGrid1.ColCount := strlst.Count; 
      StringGrid1.Rows[i]:=strlst; // adjust the row count 
      Inc(i); 
      StringGrid1.RowCount := i; 
     end; 
     // free stringlist and textfile  
     CloseFile(myfile) ; 
     strlst .free; 

     // fill in the blank entries with 0 
     for i := 0 to StringGrid1.RowCount - 1 do 
     begin 
     for j := 0 to StringGrid1.ColCount - 1 do 
      begin 
      if StringGrid1.Cells[j,i]='' then 
      StringGrid1.Cells[j,i]:='0'; 
      end; 
     end; 
    end;