Экранирующие символы во внешних таблицах BQ

У меня есть внешняя таблица, которая заполняется из файла csv. В файле csv есть поле, в котором есть escape-символ, за которым следует запятая. например, "a\,b", который должен читаться просто как "a,b". когда я загружаю CSV-файл, он разделяет его на 2 столбца «a», «b», но должен читать «a, b» в одном столбце. Я пробовал использовать опцию = '' безуспешно.

CREATE OR REPLACE EXTERNAL TABLE TEST

(A STRING,
 B STRING)
OPTIONS (
    format = 'CSV',
    quote = '\'
         )


Could someone help ?

как выглядит csv? "a\,b","c" или a\,b,c?

Jaytiger 09.02.2023 03:46

привет это выглядит так позже бла, а\, б, бла

Leon 09.02.2023 03:54

возможно, есть другой простой способ, но вы можете попробовать ниже. Надеюсь, поможет. В ответе field_delimiter CHR(1) означает рассматривать каждую строку в файле как один столбец в таблице.

Jaytiger 09.02.2023 05:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете попробовать обходной путь ниже.

CREATE OR REPLACE EXTERNAL TABLE `your-project.your-dataset.so_test` (
  raw STRING
) OPTIONS (
  uris=['gs://your-bucket/so/test2.csv'],
  format = 'CSV',
  field_delimiter = CHR(1)
);

CREATE TEMP TABLE sample_table AS
SELECT csv[SAFE_OFFSET(0)] col1,
       REPLACE(csv[SAFE_OFFSET(1)], '|', ',') col2,
       csv[SAFE_OFFSET(2)] col3,
  FROM `bigdata-cubig-data.bdc_cubig_temp.so_test`, 
UNNEST ([STRUCT(SPLIT(REPLACE(raw, '\\,', '|')) AS csv)]);

SELECT * FROM sample_table;

Образец CSV-файла

  • gs://ваш-бакет/so/test2.csv

бла, а\, б, бла

Результаты запроса

Или, используя запрос PIVOT

CREATE TEMP TABLE sample_table (
  col1 STRING, col2 STRING, col3 STRING,
) AS
SELECT * REPLACE(REPLACE(col_1, '|', ',') AS col_1) FROM (
  SELECT col, offset
    FROM `your-project.your-dataset.so_test`,
  UNNEST (SPLIT(REPLACE(csv, '\\,', '|'))) col WITH offset
) PIVOT (ANY_VALUE(col) col FOR offset IN (0, 1, 2));

SELECT * FROM sample_table;

Другие вопросы по теме