Создать единую таблицу, импортировав все файлы CSV в папку? - PullRequest
0 голосов
/ 23 октября 2019

У меня около 30-40 CSV-файлов в папке. Например, предположим, что папка «Флорида» содержит информацию о клиентах из разных городов штата Флорида. Каждый файл CSV содержит информацию о клиенте одного города. Теперь я хочу создать таблицу в SQL Server, импортировав все файлы CSV из этой папки, чтобы создать таблицу для всех клиентов во Флориде. Я хотел узнать, есть ли способ выполнить это действие сразу для всех файлов CSV. Я использую SQL Server Management Studio (SSMS). Все файлы CSV имеют одинаковые имена столбцов.

Я делаю следующее для одного файла CSV:

CREATE TABLE sales.cust (
  Full_name VARCHAR (100) NOT NULL,
  phone VARCHAR(50),
  city VARCHAR (50) NOT NULL,
  state VARCHAR (50) NOT NULL,
);

BULK INSERT sales.cust
FROM 'C:\Users..............\cust1.csv'
WITH
(
  FIRSTROW = 2,
  FIELDTERMINATOR = ',',  --CSV field delimiter
  ROWTERMINATOR = '\n',   --Use to shift the control to next row
  ERRORFILE = 'C:\Users\..............\cust1ErrorRows.csv',
  TABLOCK
)

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Предложение использовать командную строку только из-за ограниченности инструментов.

Я подумал о другом решении, которое вы можете использовать, которое могло бы помочь вам, и сделать так, чтобы вам пришлось импортировать только один файл.

  1. Создайте свою таблицу:

    CREATE TABLE sales.cust (
    Full_name VARCHAR (100) NOT NULL,
    phone VARCHAR(50),
    city VARCHAR (50) NOT NULL,
    state VARCHAR (50) NOT NULL,
    );
    
  2. С помощью командной строки выполните следующие действия:

a. Перейдите в каталог, используя cd "C:\Users..............\"

b. Скопируйте файлы в один гигантский файл, используя:

copy *.csv combined.csv

Импорт этого файла с использованием графического интерфейса в SSMS

Работа с заголовками

удаление из sales.cust, где full_name = 'Full_name' и phone = 'phone '

Вы можете сделать это только потому, что все столбцы varchar.

0 голосов
/ 24 октября 2019

Вот один путь, чтобы собрать все файлы в таблицу ---

--       from Rigel and froadie @ https://stackoverflow.com/questions/26096057/how-can-i-loop-through-all-the-files-in-a-folder-using-tsql
-- 1.Allow for SQL to use cmd shell
EXEC sp_configure 'show advanced options', 1    -- To allow advanced options to be changed.
RECONFIGURE -- To update the currently configured value for advanced options.
EXEC sp_configure 'xp_cmdshell', 1  -- To enable the feature.
RECONFIGURE -- To update the currently configured value for this feature.

-- 2.Get all FileNames into a temp table
--for repeatability when testing in SMSS, delete any prior table
IF OBJECT_ID('tempdb..#tmp') IS NOT NULL DROP TABLE #tmp
GO
CREATE TABLE #tmp(csvFileName VARCHAR(100));
INSERT INTO #tmp
EXEC xp_cmdshell 'dir /B "C:\\Users..............\\*.csv"';

--       from Chompy @https://bytes.com/topic/sql-server/answers/777399-bulk-insert-dynamic-errorfile-filename
-- 3.Create sql prototype of the Dynamic sql
---- with CSV field delimiter=',' and CSV shift the control to next row='\n'
DECLARE @sqlPrototype nvarchar(500)
SET @sqlPrototype = N'BULK INSERT sales.cust
FROM ''C:\\Users..............\\xxxx''
WITH ( FIRSTROW = 2,
       FIELDTERMINATOR = '','',  
       ROWTERMINATOR = ''\n'',   
       ERRORFILE = ''C:\\Users..............\\xxxx_ErrorRows.txt'',
       TABLOCK)'

-- 4.Loop through all of the files
Declare @fileName varchar(100)
While (Select Count(*) From #tmp where csvFileName is not null) > 0
Begin
    Select Top 1 @fileName = csvFileName From #tmp

    -- 5.Replace real filename into prototype
    PRINT(@filename)
    DECLARE @sqlstmt nvarchar(500)
    Set @sqlstmt = replace(@sqlPrototype, 'xxxx', @filename)
    --print(@sqlstmt)

    -- 6.Execute the resulting sql
    EXEC sp_executesql @sqlstmt;    

    -- 4A.Remove FileName that was just processed
    Delete from #tmp Where csvFileName = @FileName
End

Внимание. Если существует ErrorFile, то BulkInsert завершится ошибкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...