Изменить разделитель в CSV-экспорте - PullRequest
1 голос
/ 23 августа 2010

Хорошо, мой CSV Builder по существу работает. имеет 3 столбца. Имя, должность, дата. К сожалению, сейчас экспорт имеет 4 столбца. Фамилия, Имя, должность, дата. Это потому, что данные, которые я получаю из своей базы данных, называются Last, First. Есть ли в любом случае я могу легко изменить этот разделитель? Это было бы очень удобно, ха-ха.

Ответы [ 3 ]

1 голос
/ 23 августа 2010

Мне приходилось делать это несколько раз, и вам лучше всего обернуть ваше имя.Это означает, что вам придется обрабатывать это отдельно (вроде).

Исходя из того, что я читаю в вашем вопросе, вы извлекаете значения из БД с тремя столбцами: Name (LName, FName), Position и Date.Итак, ваш SQL-оператор выглядит примерно так: SELECT Name, Position, [Date] FROM Table WHERE ... И, возможно, у вас где-то есть устройство для чтения данных.

Исходя из этих предположений, я бы сделал следующее:

//SQL Connection and SQL Command have been created separately as _conn and _cmd
using(SqlDataReader _read = _cmd.ExecuteReader())
{
    string name = "";
    string position = "";
    string date = "";

    while(_read.Read()) //don't really do this, make sure you're checking for nulls and such
    {
       name = _read.GetString(0);
       position = _read.GetString(1);
       date = _read.GetString(2);

       AddLineToLines(string.Format("{0}|{1}|{2}", name, position, date));
          //AddLineToLines is a call to add to your list of lines so you can 
          // write your file.
    }
}

Это позволит вамсоздать файл с разделителем труб (вместо CSV) и избегать экранирования запятыми.

Если у вас должен быть csv, измените последний string.Format на

string.Format("\"{0}\",{1},{2}", name, position, date)

, который будет экранироватьзапятые между LastName и FirstName.

0 голосов
/ 23 августа 2010

Проблема не в том, что вы меняете разделитель (вы просто изменяете бит в своем коде запятыми на любой символ, который хотите использовать), но в дальнейшем он не будет таким совместимым.

Ваша проблема в том, что вы не правильно покидаете свои поля. Сделайте что-то вроде:

private void WriteItem<T>(StreamWriter sr, T item)
{
    string itemString = item.ToString();
    if(itemString.IndexOfAny('"', ',', '\n', '\r') != -1)//skip test and always escape for different speed/filesize optimisation
    {
        sr.Write('"');
        sr.Write(itemString.Replace("\"", "\"\""));
        sr.Write('"');
    }
    else
        sr.Write(itemString);
}
private void WriteLine<T>(StreamWriter sr, IEnumerable<T> line)
{
    bool first = true;
    foreach(T item in line)
    {
        if(!first)
            sr.Write(',');
        first = false;
        WriteItem(sr, item);
    }
}
private void WriteCSV<T>(StreamWriter sr, IEnumerable<IEnumerable<T>> allLines)
{
    bool first = true;
    foreach(IEnumerable<T> line in allLines)
    {
        if(!first)
            sr.Write('\n');
        first = false;
        WriteLine(sr, line);
    }
}

и бит в WriteItem, который заключает в кавычки элемент, когда есть ", или присутствующий символ новой строки, будет иметь дело с вашим форматом" Last, First ".

0 голосов
/ 23 августа 2010

Большинство анализаторов CSV распознают кавычки для компенсации запятых в данных.

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