Чтение CSV, изменение некоторых значений полей и их обратная запись с помощью CsvHelper.C#

Место общения программистов C#
Ответить
Anonymous
 Чтение CSV, изменение некоторых значений полей и их обратная запись с помощью CsvHelper.

Сообщение Anonymous »

Я использую CsvHelper v33.0.1 в программе C#. Я беру существующий файл CSV, содержащий более 70 столбцов и около 3000 строк, изменяю значения трех столбцов, а затем переписываю измененные строки обратно в исходный CSV. Столбцы разделены запятыми, а значения в основном текстовые (значения в кавычках), но некоторые являются числовыми (int и long).
Входящий CSV:
"chgInsert","num",..."inactive","locZip","orgPhone","stmDel","stmtEmail",...
"I",12345,..."",80836,3035551234,"email","donotuse@email.com,nobody@yahoo.com",...
"I",23456....1,,80834,"","","mail","",...

Желаемый CSV-файл:
"chgInsert","num",..."inactive","locZip","orgPhone","stmDel","stmtEmail",...
"U",12345,..."",80836,3035551234,"","",...

"U",23456....1,,80834,"","","","",...

Обратите внимание, что в исходном CSV-файле значение может быть заключено в кавычки, если оно равно нулю, ИЛИ числовое, если оно не равно нулю (пример: неактивное значение).
Код сегмент ниже работает, однако я бы предпочел не указывать имена столбцов в коде. Есть ли способ, чтобы CsvHelper отформатировал выходную строку так, чтобы она соответствовала типу значения поля входящей строки (в кавычках или без кавычек)? Я предполагал, что MustQuote поможет, но похоже, что все столбцы имеют тип string, поэтому все цитируется в модифицированном CSV (например, 12345 записывается как «12345»). Обратите внимание, что csv.Parser.RawRecord показывает значения в кавычках и без кавычек, поэтому можно определить, какие значения полей заключены в кавычки, а какие нет.
List newLines = new List();
var newRecords = new List();

//filePath contains the full path to the unmodified CSV file
if (File.Exists(filePath))
{
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
Delimiter = ",",
HasHeaderRecord = true,
ShouldQuote = args => args.FieldType == typeof(string) //The problem is that *ALL* fields are string types, so every field is quoted
};
using (var reader = new StreamReader(filePath))
{
using (var csv = new CsvReader(reader, config))
{
var records = csv.GetRecords();
foreach (var record in records)
{
// Modify 3 columns
if (record.chgInsert.Contains("I")) record.chgInsert = "U";
record.stmtDel = "";
record.stmtEmail = "";
newRecords.Add(record);
}
}
}

using (var writer = new StreamWriter(filePath, false))
using (var cw = new CsvWriter(writer, config))
{
var outRecords = new List();

foreach (var record in newRecords)
{
//Every field in record is a string type, convert some to integer (unquoted value)
//I'd rather not hardcode the column names here, since the names may change
// or be deleted in the future
if (!string.IsNullOrEmpty(record.num)) record.num = Convert.ToInt32(record.num);
if (!string.IsNullOrEmpty(record.inactive)) record.inactive = Convert.ToInt32(record.inactive);
if (!string.IsNullOrEmpty(record.locZip)) record.locZip = Convert.ToInt32(record.locZip);
if (!string.IsNullOrEmpty(record.orgPhone)) record.orgPhone = Convert.ToInt64(record.orgPhone);
outRecords.Add(record);
}
cw.WriteRecords(outRecords);
}
}


Подробнее здесь: https://stackoverflow.com/questions/790 ... -csvhelper
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»