Я использую 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
Чтение CSV, изменение некоторых значений полей и их обратная запись с помощью CsvHelper. ⇐ C#
Место общения программистов C#
1727887461
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 поможет, но похоже, что все столбцы имеют тип [b]string[/b], поэтому все цитируется в модифицированном 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);
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79044176/reading-a-csv-modify-some-field-values-writing-it-back-using-csvhelper[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия