Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сложить непустые строки через запятую / 22 сообщений из 22, страница 1 из 1
20.01.2022, 15:08
    #40128116
shmelina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить непустые строки через запятую
Здравствуйте. Есть ли простой способ сложить непустые строки через запятую, чтобы не писать такую функцию?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
function AddStr(str: array of string): string;
begin
  var s: string;
  for s in str do
    if s <> '' then
    begin
      if Result <> '' then
        Result := Result + ',';
      Result := Result + s;
    end;
end;
...
Рейтинг: 0 / 0
20.01.2022, 15:11
    #40128117
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить непустые строки через запятую
Судя по предыдущему топику, массив не нужен, внешний цикл тоже, строки можно складывать непосредственно при получении из запроса.
...
Рейтинг: 0 / 0
20.01.2022, 15:21
    #40128119
shmelina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить непустые строки через запятую
Dimitry Sibiryakov
Судя по предыдущему топику

Это другая задача.
Нужно передать на сервер (php+mysql) файлы и несколько электронных адресов. Там будут искаться клиенты по этим адресам и к ним будут подшиваться файлы.
Я понимаю, что ничего страшного не будет если параметр будет с пустыми адресами, например такой: '111@mail.ru,,222@mail.ru'. Т.е. второй адрес не указан.
Php в состоянии справится с этой задачей, но хотелось бы, чтобы было красиво и не было пустых электронных адресов.
Вопрос в том, есть ли в дельфи нужные функции или возможности, чтобы проще и короче сделать этот код.
...
Рейтинг: 0 / 0
20.01.2022, 15:28
    #40128120
Michael Longneck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить непустые строки через запятую
String.Split?
...
Рейтинг: 0 / 0
20.01.2022, 15:28
    #40128122
LocksmithPC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить непустые строки через запятую
shmelina

'111@mail.ru,,222@mail.ru'. Т.е. второй адрес не указан.
...
хотелось бы, чтобы было красиво и не было пустых электронных адресов.


AnsiReplaceStr(sAddress, ',,', ',')?
...
Рейтинг: 0 / 0
20.01.2022, 15:29
    #40128123
shmelina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить непустые строки через запятую
Код, вызывающий эту функцию выглядит так:
Код: pascal
1.
2.
3.
4.
5.
Emails := AddStr([
  DMod.SQLR.FieldByName('field1').AsString,
  DMod.SQLR.FieldByName('field2').AsString,
  DMod.SQLR.FieldByName('field3').AsString,
  DMod.SQLR.FieldByName('field4').AsString]);


Т.е. нужно собрать непустые строки через запятую.
...
Рейтинг: 0 / 0
20.01.2022, 15:31
    #40128124
shmelina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить непустые строки через запятую
LocksmithPC,
Я думал об этом. Но запятая может быть и в конце и в начале. Или вообще одна.
',111@mail.ru'
'111@mail.ru,'
','
Это снова Replace, проверки и все такое.
...
Рейтинг: 0 / 0
20.01.2022, 15:33
    #40128125
shmelina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить непустые строки через запятую
Michael Longneck
String.Split?

Изучал. А как там не добавлять пустые строки?
Было бы здорово, если была бы возможность складывать строки по условию.
...
Рейтинг: 0 / 0
20.01.2022, 15:36
    #40128127
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить непустые строки через запятую
shmelina,

а где ты берешь массив?
...
Рейтинг: 0 / 0
20.01.2022, 15:38
    #40128128
shmelina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить непустые строки через запятую
ъъъъъ,

у меня есть 4 электронных адреса, которые я беру из БД. См. выше.
Мне нужно эти адреса сложить в одну сроку через запятую.
Я решил создать отдельную функцию, в которую передаю массив срок и делаю там что нужно.
...
Рейтинг: 0 / 0
20.01.2022, 15:40
    #40128129
LocksmithPC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить непустые строки через запятую
shmelina

Это снова Replace, проверки и все такое.


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
var
  iCount: Integer;

  sFName: string;

  sAddress: string;

begin
  sAddress := '';

  for iCount := 1 to 4 do
    begin
      sFName := Format('field%d', [iCount]);

      if sAddress = '' then
        sAddress := FieldByName(sFName).AsString

      else
        sAddress := Concat(sAddress, ',', FieldByName(sFName).AsString);

    end;

  sAddress := AnsiReplaceStr(sAddress, ',,', ',,');

end;



Писал по памяти. Не проверял.
...
Рейтинг: 0 / 0
20.01.2022, 15:50
    #40128131
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить непустые строки через запятую
Не знаю чем тебя твоя функция не устраивает.


А я вот часто вот так предпочитаю:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure AddStr(var Str: string; const Str2: string; const Delimeter: string=''); 
begin
  if length(Str2)=0 then Exit;
  if (Str<>'') and (Delimeter<>'') then begin
    Str:=Str+Delimeter+Str2;
  end else begin
    Str:=Str+Str2;
  end;
end;
...
Рейтинг: 0 / 0
20.01.2022, 16:00
    #40128137
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить непустые строки через запятую
Join
...
Рейтинг: 0 / 0
20.01.2022, 16:02
    #40128138
shmelina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить непустые строки через запятую
rgreat
Не знаю чем тебя твоя функция не устраивает

К своему стыду я не так давно узнал про join и split. Оказалось это очень удобные помощники. Я подумал, а может еще что-то есть удобное для этой задачи. Но видимо нет.
...
Рейтинг: 0 / 0
20.01.2022, 16:04
    #40128141
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить непустые строки через запятую
shmelinaЯ решил создать отдельную функцию, в которую передаю массив срок и делаю там что
нужно.

Сам решил - сам и отдувайся теперь.

Функцию ты бы написал быстрее, чем этот топик...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.01.2022, 16:18
    #40128148
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить непустые строки через запятую
Michael Longneck
String.Split?
Это наоборот
Fr0sT-Brutal
Join
Пустые строки не выбросит

shmelina,

Я бы решал так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
function AddStr(str: array of string): string;
const
  CSep = ',';
var
  LBld: TStringBuilder;
  s: string;
begin
  LBld := TStringBuilder.Create;
  try
    for s in str do begin
      if s <> '' then
        LBld.Append(s).Append(CSep);
    end;
    if LBld.Length > 0 then
      LBld.Length := LBld.Length - Length(CSep);
    Result := LBld.ToString;
  finally
    LBld.Free;
  end;
end;
...
Рейтинг: 0 / 0
20.01.2022, 16:24
    #40128152
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить непустые строки через запятую
shmelina
ъъъъъ,

у меня есть 4 электронных адреса, которые я беру из БД. См. выше.
Мне нужно эти адреса сложить в одну сроку через запятую.
Я решил создать отдельную функцию, в которую передаю массив срок и делаю там что нужно.



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function catch_22(src: array of string): string;
var s: string;
begin
  result := '';
  for s in src do
    if length(s) > 0 then begin
      if length(result) > 0 then
        result := result + ',';
      result := result + s;
    end;
end;

const
  a1 = 'mail.ru';
  a2 = 'mail.ya.ru';
  a3 = 'gmail.com';
  a4 = 'yachoo.com';
begin
  writeln(catch_22([a1, a2, a3, '', a4, 'rambler.ru', '']));
  readln
end.


...
Рейтинг: 0 / 0
20.01.2022, 18:28
    #40128180
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить непустые строки через запятую
_Vasilisk_
Пустые строки не выбросит

Не умеет? Я просто не в курсе насчет RTL реализации - на своей версии сижу, с го и гейшами
ъъъъъ

Код: pascal
1.
2.
    if length(s) > 0 then begin
      if length(result) > 0 then



А в чем цимес length(s) > 0 над человеческим s <> '' ?
...
Рейтинг: 0 / 0
20.01.2022, 18:41
    #40128187
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить непустые строки через запятую
Fr0sT-Brutal
Не умеет?
Нет
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
class function TStringHelper.Join(const Separator: string; const Values: array of string): string;
begin
  Result := Join(Separator, Values, 0, System.Length(Values));
end;

class function TStringHelper.Join(const Separator: string; const Values: array of string; StartIndex,
  Count: Integer): string;
var
  I: Integer;
  Max: Integer;
begin
  if (Count = 0) or ((System.Length(Values) = 0) and (StartIndex = 0)) then
    Result := ''
  else
  begin
    if (Count < 0) or (StartIndex >= System.Length(Values)) then
      raise ERangeError.CreateRes(@SRangeError);

    if (StartIndex + Count) > System.Length(Values) then
      Max := System.Length(Values)
    else
      Max := StartIndex + Count;

    Result := Values[StartIndex];
    for I:= StartIndex + 1 to Max - 1 do
      Result := Result + Separator + Values[I];
  end;
end;

...
Рейтинг: 0 / 0
20.01.2022, 19:09
    #40128195
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить непустые строки через запятую
const перед массивом народ принципиально не ставит?
...
Рейтинг: 0 / 0
20.01.2022, 20:59
    #40128226
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить непустые строки через запятую
white_nigger
const перед массивом народ принципиально не ставит?

ага, расп3.14здяи...
...
Рейтинг: 0 / 0
21.01.2022, 10:48
    #40128333
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить непустые строки через запятую
shmelina
Код, вызывающий эту функцию выглядит так:
Код: pascal
1.
2.
3.
4.
5.
Emails := AddStr([
  DMod.SQLR.FieldByName('field1').AsString,
  DMod.SQLR.FieldByName('field2').AsString,
  DMod.SQLR.FieldByName('field3').AsString,
  DMod.SQLR.FieldByName('field4').AsString]);



Т.е. нужно собрать непустые строки через запятую.


а сразу в SQL запросе что мешает сложить, и вернуть уже готовую строку ?
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сложить непустые строки через запятую / 22 сообщений из 22, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]