2017-02-16 9 views
-1

Я работаю с CSV с разделителями каналов, в котором некоторые из записей имеют возврат каретки в одном из столбцов из-за того, как он был извлечен.SSMS - прочитать CSV-файл в таблице

Пример:

Jane|Ward|3  |1   |1  |0  |0  |||3210007  
Sam|Anderson|4  |1   |1  |0  |0  |||3210008  
Andy|Smithson |1  |1   |0  |0  |0  || 

|   
Henry|Johnson  |1  |1   |1  |0  |1  |Elementary School||900196 
Mary|Smith  |2  |1   |1  |0  |0  |||97 Ford 
Chris|Jones  |3  |1   |1  |0  |0  |||900341  
Allen|Bender |1  |33fg5  |asdd3 |0  |0  || 

|   
Amy|Peterson|3  |1   |1  |0  |0  |||3210007  

Записи все имеют 10 столбцов, так что каждый из них имеет 9 труб. В этом примере записи Энди Смитсона и Аллена Бендера имеют возврат каретки в 9-м столбце. Если какие-либо записи имеют возврат каретки, они всегда будут в 9-м столбце.

Я понял, как получить «очищенную» запись с помощью регулярного выражения в Notepad ++, но я работаю с файлом, имеющим почти 70k строк, поэтому я хотел бы попытаться автоматизировать это так же, как возможно, очевидно.

Есть ли способ как-то прочитать такой файл в таблице?

Я бы делал это в версиях SSMS 2008 и более поздних версий.

[Изменить] Я попробовал это в SSMS Import Wizard. Это не сработает, так как каждая строка заканчивается CRLF (как показано в Notepad ++), поэтому Мастер не может различать, когда строки с CRLF должны оставаться в записи или фактически являются окончанием записи.

+0

Вы даже Google это? –

+0

@ rory.ap - Да. Если вы можете указать мне сайт, который может мне помочь, сделайте это! – marky

+0

Посмотрите на команду BULK INSERT. – EMUEVIL

ответ

0

Ваш лучший выбор - использовать файл формата, чтобы он не прерывался раньше на RowTerminator и продолжался до FieldTerminator.

Пример XML формат файла для ваших данных будет выглядеть следующим образом:

<?xml version="1.0"?> 
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <RECORD> 
    <FIELD ID="1" xsi:type="CharTerm" TERMINATOR= '|' COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="2" xsi:type="CharTerm" TERMINATOR= '|' COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="3" xsi:type="CharTerm" TERMINATOR= '|' COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="4" xsi:type="CharTerm" TERMINATOR= '|' COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="5" xsi:type="CharTerm" TERMINATOR= '|' COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="6" xsi:type="CharTerm" TERMINATOR= '|' COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="7" xsi:type="CharTerm" TERMINATOR= '|' COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="8" xsi:type="CharTerm" TERMINATOR= '|' COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="9" xsi:type="CharTerm" TERMINATOR= '|' COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="10" xsi:type="CharTerm" TERMINATOR='\r\n' COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    </RECORD> 
    <ROW> 
    <COLUMN SOURCE="1" NAME="Firstname" xsi:type="SQLVARYCHAR"/> 
    <COLUMN SOURCE="2" NAME="Lastname" xsi:type="SQLVARYCHAR"/> 
    <COLUMN SOURCE="3" NAME="Column3" xsi:type="SQLVARYCHAR"/> 
    <COLUMN SOURCE="4" NAME="Column4" xsi:type="SQLVARYCHAR"/> 
    <COLUMN SOURCE="5" NAME="Column5" xsi:type="SQLVARYCHAR"/> 
    <COLUMN SOURCE="6" NAME="Column6" xsi:type="SQLVARYCHAR"/> 
    <COLUMN SOURCE="7" NAME="Column7" xsi:type="SQLVARYCHAR"/> 
    <COLUMN SOURCE="8" NAME="Column8" xsi:type="SQLVARYCHAR"/> 
    <COLUMN SOURCE="9" NAME="Column9" xsi:type="SQLVARYCHAR"/> 
    <COLUMN SOURCE="10" NAME="Column10" xsi:type="SQLVARYCHAR"/> 
    </ROW> 
</BCPFORMAT> 

и использовать его как это:

использованием bcp

bcp testdb.dbo.target_table IN D:\BCP\bulk_import_file.txt -f D:\BCP\format_file.xml -T 

Примечание: путь к файлу должен быть доступен с сервера sql для следующих двух параметров.

использованием bulk insert

bulk insert dbo.target_table 
    from '...\bulk_import_file.txt' 
    with (
    formatfile = '...\format_file.xml' 
    , firstrow = 1 -- set to 2 if it has headers 
    --, lastrow = /* if you need to skip extra lines at the end */ 
    , maxerrors = 0 
    , tablock 
); 

использованием openrowset:

select * 
from openrowset (
    bulk '...\bulk_import_file.txt' 
    , formatfile = '...\format_file.xml' 
    , firstrow = 1 -- set to 2 if it has headers 
    --, lastrow = /* if you need to skip extra lines at the end */ 
    , maxerrors = 0 
) as o; 
Смежные вопросы