Экспортируйте результаты запросов SQL Server в CSV и обрабатывайте встроенные символы новой строки, кавычки, запятые и т. Д - PullRequest
0 голосов
/ 23 октября 2018

Я использую bcp для экспорта данных из запроса SQL в файл CSV, и у меня возникают проблемы с полями, которые содержат встроенные символы новой строки, запятые, кавычки и т. Д.

У меня естьтаблица с двумя столбцами Id и Name.

Моя команда bcp выглядит следующим образом:

bcp "select Id, Name from MyTable" queryout ./results.csv -c -t, -U SA -S localhost

И полученный файл CSV выглядит следующим образом:

1,Quick brown fox
2,The quick brown fox
jumps over the
lazy dog
3,This is a "quoted" value
4,Quick, Brown, Fox

Есть ли способ bcp автоматически заключать в кавычки поля, экранировать любые существующие кавычки и т. Д., Чтобы сгенерированный CSV-файл действительно был действительным?

В идеале я бы хотел, чтобы файл csv выглядел примерно так:

"1","Quick brown fox"
"2","The quick brown fox
jumps over the
lazy dog"
"3","This is a \"quoted\" value"
"4","Quick, Brown, Fox"

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

пара частей к ответам.

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

  2. Для crlfs в ваших данных ... похоже, что BCP сделал то, что вы хотели.он распечатал их, потому что они находятся в данных.Похоже, что вы хотите, чтобы очистить их от данных, даже если они включены в исходную таблицу.Просто обработайте это с помощью функции «замена» в вашем запросе.избавьтесь от своего "select *" и замените его полным набором нужных столбцов и используйте "replace" в столбце "name".

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

обычно я использую -replace в powershell для форматирования вывода BCP, как показано ниже,

    [string]$rowStart=[System.Guid][System.Guid]::NewGuid()
    [string]$fieldTerm=[System.Guid][System.Guid]::NewGuid()
    [string]$rowTerm=[System.Guid][System.Guid]::NewGuid()

    bcp "select format(Id, '$rowStart#'), Name from Test.dbo.MyTable" queryout "C:\temp\yourfile.txt" -c -T -t"$fieldTerm" -r"$rowTerm" -S"localhost"

    $rowEndTerm='"' + $rowTerm

    cat "C:\temp\yourfile.txt" `
    | ForEach-Object { $_ -replace '"', '\"'  } `
    | ForEach-Object { $_  -replace $rowStart, '"'} `
    | ForEach-Object { $_ -replace $fieldTerm, '","'} `
    | ForEach-Object { $_ -replace "$rowTerm", $rowEndTerm} `
    | ForEach-Object { $_ -replace $rowTerm, "`r`n"} `
    > "C:\temp\results.csv"
...