Преобразование кода в VB в Delphi - PullRequest
0 голосов
/ 18 декабря 2009

У меня есть некоторый исходный код VB и я хочу преобразовать его в Delphi:

Do While Not EOF(textfile)
Line Input #textfile, Line

Dim retstring() As String         
retstring = Split(Line, Chr(32))
first  = retstring(0)
second = retstring(1)

У меня есть текстовый файл со строками, похожими на эти:

hello all
nice to
good day

Я попробовал часть исходного кода в ответах, но все еще возникают проблемы. Я вижу сообщения «привет всем» и «приятно», но на самом деле я хочу видеть «привет» и «все» вместо этого.

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  list : TStringList;
  first, second, third: string;
begin
  list := TStringList.Create;
  try
    list.Delimiter := #32;
    list.LoadFromFile('test.txt');
    first := list[0];
    second := list[1];
    ShowMessage(first);
    ShowMessage(second);
  finally
    list.Free;
  end;
end;

Ответы [ 5 ]

8 голосов
/ 18 декабря 2009

Вы можете использовать класс TStringList для разделения текстового файла.

см. Этот пример:

program SplitTextFile;

{$APPTYPE CONSOLE}

uses
  Classes,
  SysUtils;

var
 Lines : TStringList;
 Split : TStringList;
 i     : Integer;
 j     : Integer;
begin
  Lines := TStringList.Create;
  try
    Lines.LoadFromFile('c:\software\demo.txt'); //assign the file name

    Split := TStringList.Create;
    try
      Split.Delimiter := ' '; // set the delimiter

      for i := 0 to Lines.Count - 1 do //iterate over the lines of the file
      begin
        Split.DelimitedText := Lines[i];
        for j := 0 to Split.Count - 1 do //iterate over the split elements
          Writeln(Split[j]);
      end;
    finally
      Split.Free;
    end;
  finally
    Lines.Free;
  end;

  Readln;
end.
4 голосов
/ 18 декабря 2009

Один из способов разделить строку по разделителю - использовать TStringlist:

var
  list : TStringList;

begin
  list := TStringList.Create;
  try
    list.Delimiter := #32;
    list.DelimitedText := 'abc def ghi';
    first := list[0];
    second := list[1];
    third := list[2];
  finally
    list.Free;
  end;
1 голос
/ 18 декабря 2009

У меня есть универсальная утилита, которой я пользуюсь с тех пор, как у меня был Турбо Паскаль, которая выполняет то, что вы просите:

function NumStringParts(SourceStr,Delimiter:String):Integer;
var
  offset : integer;
  curnum : integer;
begin
  curnum := 1;
  offset := 1;
  while (offset <> 0) do
    begin
      Offset := Pos(Delimiter,SourceStr);
      if Offset <> 0 then
        begin
          Inc(CurNum);
            Delete(SourceStr,1,(Offset-1)+Length(Delimiter));
        end;
    end;
  result := CurNum;
end;

function GetStringPart(SourceStr,Delimiter:String;Num:Integer):string;
var
  offset : integer;
  CurNum : integer;
  CurPart : String;
begin
  CurNum := 1;
  Offset := 1;
  While (CurNum <= Num) and (Offset <> 0) do
    begin
      Offset := Pos(Delimiter,SourceStr);
      if Offset <> 0 then
        begin
          CurPart := Copy(SourceStr,1,Offset-1);
          Delete(SourceStr,1,(Offset-1)+Length(Delimiter));
          Inc(CurNum)
        end
      else
        CurPart := SourceStr;
    end;
  if CurNum >= Num then
    Result := CurPart
  else
    Result := '';
end;

Для вашего конкретного случая вы можете сделать что-то вроде следующего:

var
  Data : tStringlist;
  iX,iY,iCnt : integer;
begin
  data := tStringlist.create;
  try
    data.loadFromFile( filename );
    for iX := 0 to Data.Count-1 do
    begin
      iCnt := NumStringParts(Data.Strings[ix],#32);
      for iY := 1 to iCnt do
        ShowMessage( GetStringPart(Data.Strings[ix],#32,iY) );
    end;
  finally
    data.free;
  end;
end;

открывает файл filename, а затем вызывает CallSomeFunction для каждого слова (разделенного пробелами) в вашем текстовом файле.

1 голос
/ 18 декабря 2009

Если вы просто хотите загрузить текстовый файл для манипулирования, Stringlist подойдет. Обратите внимание, что это из памяти и не проверено!

procedure loadtext;
var
  vList: TStringList;
  vFirst, vSecond: String; 
  i: Integer;
begin
  vList := TStringList.Create;
  try
    vList.LoadFromFile('myfile.txt');

    for i := 0 to vList.Count-1 do
    begin
      vFirst  := copy(vList[i], 0, pos(vList[i], ''));
      vSecond := copy(vList[i], pos(vList[i], ''), 1000);
    end;
  finally
    FreeAndNil(vList);
  end;  
end;
0 голосов
/ 18 декабря 2009

Или, если вы действительно хотите массив, вы можете попробовать этот метод:

(скопировано с http://www.delphi3000.com/articles/article_2616.asp?SK=)

  TStringArray = array of string;


  function Split(const str: string;
                 const separator: string): TStringArray;
  // Returns an array with the parts of "str" separated by "separator"
  var
    i, n: integer;
    p, q, s: PChar;
  begin
    SetLength(Result, Occurs(str, separator)+1);
    p := PChar(str);
    s := PChar(separator);
    n := Length(separator);
    i := 0;
    repeat
      q := StrPos(p, s);
      if q = nil then q := StrScan(p, #0);
      SetString(Result[i], p, q - p);
      p := q + n;
      inc(i);
    until q^ = #0;
  end; 
...