Как добавить слово к строке в файле, не переходя к следующей строке -?

#sql #oracle #plsql #utl-file

#sql #Oracle #plsql #utl-файл

Вопрос:

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

Фактический файл (Details.csv):

 Name,Country,State,City
Lina,Brazil,Bahia,Salvador
John,USA,Texas,Austin
Ashton,Australia,Tasmania,Hobart
  

Мой вывод:

 Name,Country,State,City
,Gender
Lina,Brazil,Bahia,Salvador
,Female
John,USA,Texas,Austin
,Male
Ashton,Australia,Tasmania,Hobart
,Male
  

Ожидаемый результат (Details_upd.csv):

 Name,Country,State,City,Gender
Lina,Brazil,Bahia,Salvador,Female
John,USA,Texas,Austin,Male
Ashton,Australia,Tasmania,Hobart,Male
  

——Код———

 DECLARE

   f_line      VARCHAR2 (32767);

   file_1      UTL_FILE.file_type;
   file_2      UTL_FILE.file_type;

   f_dir       VARCHAR2 (25)  := 'DATA';

   L_check_UPDATED BOOLEAN;
   l_line VARCHAR2(32767);

BEGIN

   file_1 := UTL_FILE.fopen (f_dir,'Details.csv','R');

   file_2 := UTL_FILE.fopen (f_dir,'Details_upd.csv', 'W');

      UTL_FILE.get_line (file_1, f_line);

      l_line := trim(f_line);            

      UTL_FILE.PUT_LINE(file_2,l_line||','||'Gender');

   LOOP

      L_check_UPDATED := TRUE;

      /*--omitting the LOGIC part of code--*/   

        IF (L_check_UPDATED) THEN

        l_line := trim(f_line);

        UTL_FILE.PUT(file_2,l_line||',Male');

        ELSE

        l_line := trim(f_line);

        UTL_FILE.PUT_LINE(file_2,l_line||',Female');

        END IF;

   END LOOP;

   UTL_FILE.fclose (file_1);
   UTL_FILE.fclose (file_2);

END;
  

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

1. Вы слишком усложняете свою задачу / переосмысливаете вещи. Предположительно, вам придется прочитать файл, чтобы сопоставить его с полом в базе данных (?), Поэтому вы можете просто упростить себе жизнь: замените весь файл новым файлом, который содержит старое содержимое плюс новые данные. Вы не хотите этого делать?

2. Привет, Caius, я также попытался скопировать в новый файл, но все равно не смог получить ожидаемый результат .. можете ли вы, пожалуйста, помочь мне в этом -?

3. Каков ваш код?

4. Да, показать существующий код? Также подробно расскажите, почему вы хотите использовать UTL_FILE? Чтение CSV с внешней таблицей и запись новой с помощью Spool заняли бы несколько строк кода (вы используете sqlplus для этого?)

5. Привет, я добавил код, который я использую.. Я исключил логику и сохранил только часть, связанную с файлом…. Привет @CaiusJard Я использую utl_file, потому что это уже существующий код, который мне предоставили и попросили внести изменения… пожалуйста, дайте мне знать о каких-либо других более простых подходах к этому … если это невозможно с помощью utl_file

Ответ №1:

Вам нужно будет удалить символ новой строки в конце строки, которую вы прочитали, используя GET_LINE. Попробуйте:

 l_line := rtrim (f_line, ' ' || CHR (10) || CHR (13))
  

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

1. Интересно — я согласен, что, похоже, появляются случайные символы новой строки, я просто удивлен, потому что я не думал, что GET_LINE возвращает строки с [CR] LF в конце — из документов 10g: «Процедура GET_LINE Эта процедура считывает текст из открытого файла, идентифицируемого дескриптором файла, и помещает текст в параметр выходного буфера. Текст считывается до, но не включая, символ окончания строки , или до конца файла, или до конца параметра len. Оно не может превышать max_linesize, указанный в FOPEN.» ..

2. @steven Это сработало для меня .. спасибо всем за помощь … 🙂

Ответ №2:

Скорее всего, ваш oracle — это unix (символ окончания строки — chr (10)), а ваш файл — двоичный файл, переданный Windows (терминатор строки chr(13) chr(10))

И после чтения utl_file остается chr(13). Вы можете использовать функцию дампа для анализа содержимого буфера.