#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;