Импортируйте csv в SQLServer, если после текстового квалификатора есть пробелы

У меня есть CSV-файл с колонкой GeoCodes. Это использует "как текстовый классификатор.

Я пытаюсь импортировать это в SQLServer с помощью мастера импорта SQL Server. Проблема с данными заключается в том, что если GeoCode отсутствует, CSV-файл иногда выводит GeoCode как " ", а затем несколько пробелов. Эта ошибка возникает при попытке импортировать данные, поскольку они собирают данные в текстовом квалификаторе, а затем перед следующим разделителем-запятой стоят эти пробелы.

Пример данных ниже. Строка Pontypandy - это строка с ошибками.

Place      ,Geo Codes           ,Type                          
Northpole  ,"90.0000,0.0000    ",Pole                          
Southpole  ,"-90.0000,0.0000   ",Pole                          
Pyramids   ,"29.9765,31.1313   ",BigTriangle                   
France     ,"                  ",Country                       
Pontypandy ," "                 ,City                          

Я должен использовать классификаторы текста, поскольку в GeoCodes есть запятая.

Я не могу сказать, как данные отправляются мне, и поэтому должен иметь дело с данными как есть.

В качестве обходного пути, прежде чем импортировать, я должен найти и заменить данные в блокноте. Это добавляет дополнительный шаг к работе, которая, надеюсь, не нужна.

Можно ли как-нибудь обойти " " пробелы во время импорта?

В качестве дополнительного примечания, в настоящее время у меня нет доступа к SSIS, но если это можно сделать там проще, ответьте, пожалуйста, так как это может помочь мне оправдать получение SSIS (возможно, мне придется удалить этот комментарий позже, если мне придется покажи это моему менеджеру).

2 ответа

Решение

Если ваши данные действительно так, как вы показываете выше, вы можете использовать формат с фиксированной шириной. Импортируйте данные как есть и замените "потом". Это не лучшее решение.

Гораздо лучше: перед импортом передайте файл импорта через sed. Это не только намного быстрее, но во всех случаях, когда данные больше вашей оперативной памяти, единственный простой способ (хорошо, есть и другие). Все, что вам нужно, это sed на уровне операционной системы. Если вы можете скопировать исполняемый файл куда-нибудь, это все, что вам нужно. Если вы хотите заменить "[любое количество пробелов] на", это регулярное выражение должно быть:

cat myfile.txt|sed -b -e "s/\" *,/\",/">yournewfile.txt

Регулярное выражение становится легким, как только вы поймете, что: - s означает "Заменить", - /first /second/ означает "искать первое и заменить вторым", - "сбежал" (из-за DOS) - Пробел и * означает любое число пробелы, значит,

На многих системах sed все еще существует (cygwin). Повеселись!

Два метода массовой вставки

  1. Массовая вставка на основе строк
    • Наиболее полезно, когда у вас есть строковые столбцы в CSV
    • Сначала вам нужно будет создать таблицу с двумя полями: identity & varchar(max); identity будет означать количество строк & varchar(max) будут ваши данные строки
    • Создайте представление, которое выбирает только varchar(max) поле из таблицы выше

Синтаксис массовой вставки будет выглядеть примерно так:

BULK INSERT AdventureWorks2012.Sales.v_SalesOrderDetail  
FROM 'f:\orders\lineitem.csv'  
    WITH   (  
        ROWTERMINATOR =' |\n'  
    );  
  1. Вставка на основе столбцов:
    • Большинство используют это широко, но полезно и надежно, только когда нет строковых столбцов.
    • Используйте наиболее распространенный синтаксис массовой вставки с RowTerminator а также LineTerminator опции

Рекомендации:

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