SQL Server BCP Export где запятая в поле SQL - PullRequest
0 голосов
/ 04 сентября 2018

Я успешно экспортировал файл в CSV. Я использовал следующий код для экспорта файла:

exec xp_cmdshell 'bcp "[DC_TrainEnvironment].[dbo].[HAFacilities_Master]" out "\\fspincdc01\data$\HIMSSAnalytics\Data Analyst\HG Data\Technical Documentation\HA Facilities\HAFacilities_Master.csv" -f "\\fspincdc01\data$\HIMSSAnalytics\Data Analyst\HG Data\Technical Documentation\HA Facilities\HAFacilities_Master_FORMAT.fmt" -o "\\fspincdc01\data$\HIMSSAnalytics\Data Analyst\HG Data\Technical Documentation\HA Facilities\HAFacilities_Master_LOG.txt" -T -S "HAPDBCDC02,2112"'

Это хорошо работает, но есть проблема. В некоторых полях есть запятые. Я использую этот формат файла:

enter image description here

Что я могу сделать в файле формата, чтобы избежать необходимости изменять весь файл формата? Есть ли быстрый способ указать, что терминатор поля не будет заканчиваться запятой в этих определенных полях? То есть "','" или же "'',''"?

Ценю любую помощь. Спасибо

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018

Если поле, которое вы экспортируете, может содержать символ, который вы используете для разделения полей в вашем файле, вы можете выбрать:

  1. Используйте другой разделитель - кажется, это самый простой способ. Просто используйте "|" или "~" в качестве разделителя. Сделайте глобальную замену "," на "|" в формате файла практически с любым текстовым редактором. Непонятно, почему было бы сложно изменить «весь» файл. Может быть, у вас есть получатель файла, которому требуется разделить запятыми?

  2. Если вы должны использовать запятые в качестве разделителя, вы должны изменить разделитель столбца с запятой (,) на quote-comma-quote (","). Для этого вам нужно использовать escape-символ, чтобы программа BCP игнорировала кавычки, которые вы хотите использовать в качестве разделителей в выходном файле, поэтому она не воспринимает их как кавычки, которые, как она понимает, содержат разделитель в файле формата. , Итак ...

Вместо "," ... используйте ... "\", \ ""

Это приведет к следующему

col1, col2, "цв, 3", COL4

Для col1 разделитель:, для представления этого в файле формата используйте: ","

Для col2 разделитель:, ", чтобы представить это в файле формата, используйте:", \ ""

Для col3 разделитель: ", для представления этого в файле формата используйте:" \ ","

Для col4 разделитель:, для представления этого в файле формата используйте: ","

Надеюсь, это поможет.

0 голосов
/ 25 июня 2019

Это мое решение на C #, вам придется изменить его для использования в SQL Server, но шаблон тем не менее:

private static void EliminateCommasInFields(List<string> files, string path)
{
    foreach (var f in files)
    {
        string filename = path + f.Substring(0, f.Length - 4);

        StreamReader sr = new StreamReader(filename);
        String[] rows = Regex.Split(sr.ReadToEnd(), "\r\n");
        sr.Close();
        StreamWriter sw = new StreamWriter(filename);

        for (int i = 0; i < rows.Length; i++)
        {
            //search the row for the dreaded ," (indicating a comma in the field)
            while (rows[i].IndexOf(",\"") > 0) 
                {
                    //find the position of the first ," and it's ending ",
                    int start = rows[i].IndexOf(",\""); 
                    int end = rows[i].IndexOf("\",");
                    //find the position of the first comma within this field
                    int comma = rows[i].IndexOf(",", start + 1, end - start);
                    while (comma > 0) //eliminate all the commas within this cell
                    {
                        //Replace the offending comma with a space 
                        rows[i] = rows[i].Substring(0, comma) + " " + rows[i].Substring(comma + 1, rows[i].Length - (comma + 1)); 
                        //Search for next comma
                        comma = rows[i].IndexOf(",", start + 1, end - start);
                    }
                    //Save the rest of the row eliminating the double quotes for this cell
                    rows[i] = rows[i].Substring(0, end ) + rows[i].Substring(end + 1, rows[i].Length - (end + 1));
                    rows[i] = rows[i].Substring(0, start + 1) + rows[i].Substring(start+ 2, rows[i].Length - (start + 2));

                }

            sw.WriteLine(rows[i]);
        }
        sw.Close();
    }
}
0 голосов
/ 04 сентября 2018

С большим трудом. Вам нужно будет выбрать столбцы в команде bcp и заменить запятые.

exec xp_cmdshell 'bcp "SELECT ''ColumnHeader'' UNION ALL SELECT REPLACE(Column1, '','', '''') FROM [DC_TrainEnvironment].[dbo].[HAFacilities_Master]" out "\\fspincdc01\data$\HIMSSAnalytics\Data Analyst\HG Data\Technical Documentation\HA Facilities\HAFacilities_Master.csv" -f "\\fspincdc01\data$\HIMSSAnalytics\Data Analyst\HG Data\Technical Documentation\HA Facilities\HAFacilities_Master_FORMAT.fmt" -o "\\fspincdc01\data$\HIMSSAnalytics\Data Analyst\HG Data\Technical Documentation\HA Facilities\HAFacilities_Master_LOG.txt" -T -S "HAPDBCDC02,2112"'
...