powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / как отделить данные разделенные запятой?
24 сообщений из 49, страница 2 из 2
как отделить данные разделенные запятой?
    #39006903
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

Н-да... Я почему-то тяготею к конструкциям типа:
Код: plsql
1.
2.
3.
  POS=POSITION(DELIMITERCHAR,INCOMINGDATA);
  S=SUBSTRING(INCOMINGDATA FROM 1 FOR POS-1);
  INDATA=TRIM(DELIMITERCHAR FROM RIGHT(INCOMINGDATA,CHAR_LENGTH(INCOMINGDATA)-POS));

завернутым в цикл WHILE (POS>0). Без всяких RDB$DATABASE.
...
Рейтинг: 0 / 0
как отделить данные разделенные запятой?
    #39006904
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemarselect trim(leading ',' from :T_STR_2)
from RDB$DATABASE
into :T_STR_5;

ты как там, хорошо себя чувствуешь? rdb$database по ночам не снится?

T_STR_5= trim(leading ',' from :T_STR_2);
...
Рейтинг: 0 / 0
как отделить данные разделенные запятой?
    #39006906
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ingvar007,

только замени все эти select ... rdb$database на обычные присвоения значений переменным от функций, как я привел выше.
...
Рейтинг: 0 / 0
как отделить данные разделенные запятой?
    #39006916
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
ты как там, хорошо себя чувствуешь?
В воскресенье вернулся с исторической родины, прихожу постепенно в норму :)
...
Рейтинг: 0 / 0
как отделить данные разделенные запятой?
    #39006982
Фотография zirra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий> Игорь, ты случайно не рыжий, не?
Ну, тут как-то плохо видно


--
Vladimir A.Bakhvaloff
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как отделить данные разделенные запятой?
    #39006992
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zirra,да рыжий,рыжий. И жена рыжая, и дети рыжие
https://yadi.sk/i/uIvL_P8KhrZTE
...
Рейтинг: 0 / 0
как отделить данные разделенные запятой?
    #39007005
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

это хорошо, но одержимость rdb$database все же вылечи.
...
Рейтинг: 0 / 0
как отделить данные разделенные запятой?
    #39007029
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvGallemar,

это хорошо, но одержимость rdb$database все же вылечи.
Вылечу. Опыта мало и контроля нет,вот и пишу как умею.
...
Рейтинг: 0 / 0
как отделить данные разделенные запятой?
    #39007036
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvодержимость rdb$database все же вылечи.

В копилку утяну, если не против ;)))
...
Рейтинг: 0 / 0
как отделить данные разделенные запятой?
    #39007128
Фотография Mikhail Tchervonenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ingvar007,

Код: sql
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.
create or alter procedure STR2ROW (
    STRING varchar(2048),
    SEPARATOR varchar(1))
returns (
    ROW varchar(20))
as
begin
  Separator = coalesce(Separator, ';');
  if (Separator = '') then Separator = ';';
  Row = '';

  while (String != '') do
  begin
    if (substring(String from 1 for 1) != Separator) then
      Row = Row || substring(String from 1 for 1);
    else
    begin
      if (Row != '') then suspend;
      Row = '';
    end
    String = substring(String from 2);

  end
  if (Row != '') then suspend;
end


ну а далее как угодно, хоть по полям распихивай хоть ещё что делай
...
Рейтинг: 0 / 0
как отделить данные разделенные запятой?
    #39007143
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail Tchervonenko
Код: sql
1.
String != ''


Почему не char_length?
...
Рейтинг: 0 / 0
как отделить данные разделенные запятой?
    #39007145
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail Tchervonenko,

Вроде как если String=='' или String is NULL - будут проблемы...
...
Рейтинг: 0 / 0
как отделить данные разделенные запятой?
    #39007148
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanMikhail Tchervonenko
Код: sql
1.
String != ''



Почему не char_length?
И в догонку: почему нет функции POSITION?
...
Рейтинг: 0 / 0
как отделить данные разделенные запятой?
    #39007150
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Mikhail Tchervonenko!
You wrote on 14 июля 2015 г. 16:48:16:

Mikhail TchervonenkoSEPARATOR varchar(1)оху ительно!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как отделить данные разделенные запятой?
    #39007151
Фотография Mikhail Tchervonenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanMikhail Tchervonenko
Код: sql
1.
String != ''


Почему не char_length?
да, можно
эт вообще из говнопроекра кусок говнокода, никак не что то рекомендуемое
но ему походу это и надо
сама необходимость такой функции говорит об говнопроектировании
...
Рейтинг: 0 / 0
как отделить данные разделенные запятой?
    #39007158
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail Tchervonenko,

Вот передаст ТС на вход строчку из CSV " ;;ABC;; " - опять прибежит "спасите, не работает!"...
...
Рейтинг: 0 / 0
как отделить данные разделенные запятой?
    #39007190
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail Tchervonenkoну а далее как угодно, хоть по полям распихивай хоть ещё что делай
Есть проблемы в такой реализации "сплита":
1. Разделитель не более одного символа
2. Двойные разделители проглатываются (что ТСу может быть критично)
Посему:
split
Код: sql
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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
create or alter procedure SPLIT (
    SOURCE varchar(32000),
    DELIMITER varchar(256),
    WITH_EMPTY smallint = 1)
returns (
    NN integer,
    WORD varchar(4096))
AS
declare variable I integer;
declare variable START_FROM integer;
declare variable ELEMENT varchar(1024);
declare variable SOURCE_LENGTH integer;
declare variable DELIMITER_LENGTH integer;
begin
/*==============================================================================
  Режет текст по разделителю
  Auhor: Alex Bekhtin
  Date: XX.6-7.2008
  GROUP: Утилитарные
---
  with_empty - флаг указывается для сохранения пустых элементов, например

select * from split('aaa;;;bbb;ccc;', ';', 1)
----------
NN    WORD
1    aaa
2    
3    
4    bbb
5    ccc
6

select * from split('aaa;;;bbb;ccc', ';', 0)
----------
NN    WORD
1    aaa
2    bbb
3    ccc
==============================================================================*/
  if (:delimiter is null) then
  begin
    exception dev_error 'Не задан разделитель!';
  end
  nn = 1;
  i = 1;
  start_from = 1;
  source_length = character_length(:source);
  delimiter_length = character_length(:delimiter);
  while ( i <= (source_length - delimiter_length + 1) ) do
  begin
    element = substring(source from i for delimiter_length);
    if ( element = delimiter ) then
    begin
      if ( i = start_from ) then
      begin
        if ( with_empty = 1 ) then
        begin
          word = '';
          suspend;
          NN = NN + 1;
        end
      end
      else /* i <> start_from */
      begin
        word = substring(source from :start_from for :i - :start_from);
        suspend;
        NN = NN + 1;
      end

      if ( (i + delimiter_length = source_length + 1) and (with_empty = 1) ) then
      begin
        word = '';
        suspend;
        exit;
      end

      start_from = i + delimiter_length;
      i = start_from;
    end
    else
    begin
      i = i + 1;
    end
  end

  if ( start_from <= character_length(source) ) then
  begin
    word = substring(source from start_from);
    suspend;
  end
end



Код: sql
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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
execute block
returns (val varchar(100), val1 varchar(100), val2 varchar(100), val3 varchar(100))
as
declare variable NN integer;
declare variable WORD varchar(4096);
begin
  for
    with A(val) as (
         select 'aaa;bbb;ccc' from rdb$database
         union all
         select 'aaa;bbb;' from rdb$database
         union all
         select 'aaa;;' from rdb$database
         union all
         select 'aaa' from rdb$database
         union all
         select ';bbb;' from rdb$database
         union all
         select ';bbb' from rdb$database
         union all
         select ';;ccc' from rdb$database
        )
   select val from A into :val do
   begin
      val1 = null;
      val2 = null;
      val3 = null;
      for select NN, WORD from split(:val, ';')
        into :NN, :WORD
         do
      begin
        if (NN = 1) then val1 = WORD;
        else if (NN = 2) then val2 = WORD;
        else if (NN = 3) then val3 = WORD;
      end
      SUSPEND;
   end
end
...
Рейтинг: 0 / 0
как отделить данные разделенные запятой?
    #39007192
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail Tchervonenkoсама необходимость такой функции говорит об говнопроектировании
Наличие или отсутствие функции a-la-split ничего не говорит о проекте.
...
Рейтинг: 0 / 0
как отделить данные разделенные запятой?
    #39007197
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgmНаличие или отсутствие функции a-la-split ничего не говорит о проекте.

Наличие нескольких значений, которые нужно разделять, в одном поле, говорит о нарушении
первой НФ. Что и характеризует проект в целом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как отделить данные разделенные запятой?
    #39007240
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail Tchervonenkowadmanпропущено...

Почему не char_length?
да, можно
эт вообще из говнопроекра кусок говнокода, никак не что то рекомендуемое
но ему походу это и надо
сама необходимость такой функции говорит об говнопроектировании
И ты решил говном поделится?
...
Рейтинг: 0 / 0
как отделить данные разделенные запятой?
    #39007246
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GallemarMikhail Tchervonenkoэт вообще из говнопроекра кусок говнокода
И ты решил говном поделится?

А пусть не только ему плохо будет
...
Рейтинг: 0 / 0
как отделить данные разделенные запятой?
    #39007286
Фотография Mikhail Tchervonenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterGallemarпропущено...

И ты решил говном поделится?

А пусть не только ему плохо будет

ну как бы не моё, не жалко :)
я такое не использую т.к. нефиг (с)
...
Рейтинг: 0 / 0
как отделить данные разделенные запятой?
    #39007288
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail Tchervonenkoя такое не использую т.к. нефиг (с)
Ну и не предлагай тогда
...
Рейтинг: 0 / 0
как отделить данные разделенные запятой?
    #39007539
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvGallemar,

это хорошо, но одержимость rdb$database все же вылечи.
вылечил

Код: plsql
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.
29.
30.
31.
32.
33.
34.
CREATE OR ALTER trigger table_1_bi0 for table_1
active before insert position 0
as
declare variable T_ID_1 integer;
declare variable T_ID_2 integer;
declare variable T_STR_1 varchar(255);
declare variable T_STR_2 varchar(255);
declare variable T_STR_3 varchar(255);
declare variable T_STR_5 varchar(255);
declare variable T_STR_6 varchar(255);
declare variable T_STR_7 varchar(255);
begin
  T_ID_1 = position(',' in new.FIELD1) - 1;

  T_STR_1 = substring(new.FIELD1 from 1 for :T_ID_1);

  T_STR_2 = trim(leading :T_STR_1 from new.FIELD1);

  T_STR_5 = trim(leading ',' from :T_STR_2);

  new.FIELD2 = :T_STR_1;

  T_ID_2 = position(',' in :T_STR_5) - 1;

  T_STR_3 = substring(:T_STR_5 from 1 for :T_ID_2);

  T_STR_6 = trim(leading :T_STR_3 from :T_STR_5);

  T_STR_7 = trim(leading ',' from :T_STR_6);

  new.FIELD3 = :T_STR_3;

  new.FIELD4 = :T_STR_7;
end

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


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