Как разделить строку в delphi

#delphi #delphi-2010

#delphi #delphi-2010

Вопрос:

Мне просто нужно разделить строку типа: "STANS", "Payment, chk#1", ,1210.000 на массив, основанный на , . Результат в списке строк будет

 STANS  
Payment, chk#1  

1210.000
  

Комментарии:

1. Это не ответ, но я пока не могу прокомментировать… Как я могу сделать то же самое, но вместо «,» иметь «;»… Спасибо

Ответ №1:

Создайте TStringList и назначьте свою строку через запятую для StringList.CommaText . Это анализирует ваш ввод и возвращает разделенные строки в качестве элементов списка строк.

 StringList.CommaText := '"STANS", "Payment, chk# 1", ,1210.000';
//StringList[0]='STANS'
//StringList[1]='Payment, chk# 1'
//etc.
  

Комментарии:

1. Если это работает не совсем правильно, в сети также есть улучшенные версии.

2. @mj2008 Не могли бы вы пояснить, пожалуйста? Этот код отлично работает в приведенном примере. Если вы собираетесь опровергнуть ответ, лучше предоставить некоторые доказательства. Если у вас есть доказательства, то я с радостью буду исправлен.

3. Я поддержал вас и думаю, что это правильный ответ. Я не собирался вас «развенчивать»! У меня есть TStringCSVList от Magenta Systems, который вносит некоторые улучшения в пространство, но он выпущен в 2000 году, так что, возможно, текущая реализация Delphi лучше. Для хорошего CSV Delphi подходит «из коробки». Для dodgy CSV существуют похожие вещи.

4. @»Дэвид Хеффернан» Если строка содержит пробелы между запятыми, но без двойных кавычек, как бы вы поступили по этому поводу? Например, у меня есть «900 024000649314,2015/07/04,08:23:12» в качестве первой части моей строки. Если я сделаю следующее: ShowMessage(StringList[0]); Он выводит только 900. Заранее спасибо!

5. Для параметра @DJSquared установлено StrictDelimiter значение True .

Ответ №2:

Я написал эту функцию, и она идеально работает для меня в Delphi 2007

 function ParseCSV(const S: string; ADelimiter: Char = ','; AQuoteChar: Char = '"'): TStrings;
type
  TState = (sNone, sBegin, sEnd);
var
  I: Integer;
  state: TState;
  token: string;

    procedure AddToResult;
    begin
      if (token <> '') and (token[1] = AQuoteChar) then
      begin
        Delete(token, 1, 1);
        Delete(token, Length(token), 1);
      end;
      Result.Add(token);
      token := '';
    end;

begin
  Result := TstringList.Create;
  state := sNone;
  token := '';
  I := 1;
  while I <= Length(S) do
  begin
    case state of
      sNone:
        begin
          if S[I] = ADelimiter then
          begin
            token := '';
            AddToResu<
            Inc(I);
            Continue;
          end;

          state := sBegin;
        end;
      sBegin:
        begin
          if S[I] = ADelimiter then
            if (token <> '') and (token[1] <> AQuoteChar) then
            begin
              state := sEnd;
              Continue;
            end;

          if S[I] = AQuoteChar then
            if (I = Length(S)) or (S[I   1] = ADelimiter) then
              state := sEnd;
        end;
      sEnd:
        begin
          state := sNone;
          AddToResu<
          Inc(I);
          Continue;
        end;
    end;
    token := token   S[I];
    Inc(I);
  end;
  if token <> '' then
    AddToResu<
  if S[Length(S)] = ADelimiter then
    AddToResult
end;