«Задача скрипта C # для удаления четверных кавычек перед загрузкой файла .CSV» - PullRequest
2 голосов
/ 27 марта 2019

У меня есть довольно простой пакет служб SSIS, который загружает файл .csv в таблицу SQL. Однако, когда пакет пытается прочитать источник .csv в задаче потока данных, я получаю сообщение об ошибке: «Разделитель столбца для столбца« X »не найден. Произошла ошибка при обработке файла« file.csv »для данных». строка "Y". "

В данном случае происходит то, что есть несколько строк из тысяч, которые содержат строку в четырехкратных кавычках, т. Е. "Джейн", Джилл "Доу". Удаление кавычек из этих строк в UltraEdit работает вручную, однако я пытаюсь автоматизировать эти пакеты. Производный столбец не работает, так как это проблема с разделителем.

Оказывается, мне нужна задача скрипта, чтобы удалить четверные кавычки, прежде чем пакет сможет загрузить файл должным образом. Приведенный ниже код (который я собрал из разных источников) принимается службами SSIS как безошибочный, но при выполнении возникает ошибка выполнения задачи DTS Script:

#region Namespaces
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
#endregion

namespace ST_a881d570d1a6495e84824a72bd28f44f
 {
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
    public void Main()
    {
        // TODO: Add your code here
        var fileContents = System.IO.File.ReadAllText(@"C:\\File.csv");

        fileContents = fileContents.Replace("<body>", "<body onload='jsFx();' />");
        fileContents = fileContents.Replace("</body>", "</body>");

        System.IO.File.WriteAllText(@"C:\\File.csv", fileContents);

    }

    #region ScriptResults declaration
    /// <summary>
    /// This enum provides a convenient shorthand within the scope of this class for setting the
    /// result of the script.
    /// 
    /// This code was generated automatically.
    /// </summary>
    enum ScriptResults
    {
        Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
        Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
    };
    #endregion

    }
}

Альтернативный скрипт, который у меня есть:

{
string filepath = (string)Dts.Variables[@C:\\"File.csv"].Value;
var fileContents = System.IO.File.ReadAllText(filepath);
fileContents = fileContents.Replace("\"\"", "");

System.IO.File.WriteAllText(@C:\\"File.csv", fileContents);

}

Что я делаю не так?

1 Ответ

2 голосов
/ 27 марта 2019

Следующий пример C # будет искать файл CSV, удалять все двойные кавычки, содержащиеся в тексте с двойными кавычками, а затем записывать измененное содержимое обратно в файл. Регулярное выражение возвращает совпадение с любой двойной кавычкой, которая либо не находится в начале или конце строки, либо не имеет запятой непосредственно перед / после нее, и заменяет двойную кавычку пустой строкой. Вы, вероятно, уже делаете это, но убедитесь, что переменная, содержащая путь к файлу, указана в поле ReadOnlyVariables Задачи сценария.

using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;


string filePath = Dts.Variables["User::FilePath"].Value.ToString();

List<String> outputRecords = new List<String>();
if (File.Exists(filePath))
{
 using (StreamReader rdr = new StreamReader(filePath))
 {
  string line;
  while ((line = rdr.ReadLine()) != null)
  {
      if (line.Contains(","))
      {
          string[] split = line.Split(',');

       //replace double qoutes between text
       line = Regex.Replace(line, "(?<!(,|^))\"(?!($|,))", x => x.Value.Replace("\"", ""));

      }
      outputRecords.Add(line);
    }
 }

 using (StreamWriter sw = new StreamWriter(filePath, false))
 {
     //write filtered records back to file
     foreach (string s in outputRecords)
         sw.WriteLine(s);
  }
}
...