前言

平常都是用 Excel 的多, 但这一次遇到 Google Ads. 谷歌嘛, 当然不喜欢微软的 Excel.

硬是要求 CSV. 没办法, 只能找 Library 搞一搞了.

参考

Docs – Getting Started

介绍

CsvHelper 只能简单的读写 CSV file, 接口也很少. 它最好的使用方式是一个 CSV file 对应一个 List<Item>.

它甚至不能像 Excel 那样, 选择某个 cell 直接修改. 只能 replace all.

安装

dotnet add package CsvHelper

Read CSV

首先定义 DataClass

和 Mapping logic

public class OfflineConversionData
{
// format refer: https://support.google.com/google-ads/answer/7014069#prepare_data
public string GoogleClickId { get; set; } = "";
public string ConversionName { get; set; } = "";
public string ConversionTime { get; set; } = "";
public decimal ConversionValue { get; set; }
public string ConversionCurrency { get; set; } = "";
}
public sealed class OfflineConversionDataMap : ClassMap<OfflineConversionData>
{
public OfflineConversionDataMap()
{
Map(e => e.GoogleClickId).Name("Google Click ID").Index(0);
Map(e => e.ConversionName).Name("Conversion Name").Index(1);
Map(e => e.ConversionTime).Name("Conversion Time").Index(2);
Map(e => e.ConversionValue).Name("Conversion Value").Index(3);
Map(e => e.ConversionCurrency).Name("Conversion Currency").Index(4);
}
}

然后

var rootPath = webHostEnvironment.WebRootPath;
var csvFilePath = Path.Combine(rootPath, "google-offline-conversion.csv");
using var streamReader = new StreamReader(csvFilePath);
using var csvReader = new CsvReader(streamReader, CultureInfo.InvariantCulture);
csvReader.Context.RegisterClassMap<OfflineConversionDataMap>();
var datas = csvReader.GetRecords<OfflineConversionData>();

read to DataTable

var rootPath = webHostEnvironment.WebRootPath;
var csvFilePath = Path.Combine(rootPath, "google-offline-conversion.csv");
using var streamReader = new StreamReader(csvFilePath);
using var csvReader = new CsvReader(streamReader, CultureInfo.InvariantCulture);
using var dataReader = new CsvDataReader(csvReader);
var table = new DataTable();
table.Load(dataReader);
var value = table.Rows[0][0].ToString(); // data only no header

Write CSV

using var memoryStream = new MemoryStream();
using var streamWriter = new StreamWriter(memoryStream);
using var csvWriter = new CsvWriter(streamWriter, CultureInfo.InvariantCulture);
csvWriter.Context.RegisterClassMap<OfflineConversionDataMap>(); var conversionDatas = new List<OfflineConversionData> {
new OfflineConversionData {
GoogleClickId = "EAIaIQobChMI9dfq693m_QIVRAQrCh3XcAANEAAYAyAAEgJJgPD_BwE",
ConversionName = "Test Offline Conversion",
ConversionTime = "2023-03-19 08:28:41 America/Los_Angeles",
ConversionValue = 230,
ConversionCurrency = "SGD",
},
new OfflineConversionData {
GoogleClickId = "CjwKCAjwq-WgBhBMEiwAzKSH6C7RiEiGFcxvUAr6GEMhGPcYyWSOSo5eiiD_rzedifklbBVhKO4fVBoCUH8QAvD_BwE",
ConversionName = "Test Offline Conversion",
ConversionTime = "2023-03-22 11:09:01 Asia/Singapore",
ConversionValue = 250,
ConversionCurrency = "SGD",
}
};
await csvWriter.WriteRecordsAsync<OfflineConversionData>(conversionDatas);
await csvWriter.FlushAsync(); var rootPath = webHostEnvironment.WebRootPath;
var csvFilePath = Path.Combine(rootPath, "google-offline-conversion.csv");
using var fileStream = System.IO.File.Create(csvFilePath);
await fileStream.WriteAsync(memoryStream.ToArray());
await fileStream.FlushAsync();

其它写入

csvWriter.WriteField("Hello World"); // first cell
csvWriter.NextRecord(); // next row
csvWriter.WriteField("Hello World 2"); // first cell

ASP.NET Core Library – CsvHelper的更多相关文章

  1. 《ASP.NET Core 高性能系列》致敬伟大的.NET斗士甲骨文!

    写在开始 三年前,曾写过一篇文章:从.NET和Java之争谈IT这个行业,当时遭到某些自认为懂得java就了不起的Javaer抨击, 现在可以致敬伟大的.NET斗士甲骨文了 (JDK8以上都需要收费, ...

  2. ASP.NET CORE MVC 2.0 项目中引用第三方DLL报错的解决办法 - InvalidOperationException: Cannot find compilation library location for package

    目前在学习ASP.NET CORE MVC中,今天看到微软在ASP.NET CORE MVC 2.0中又恢复了允许开发人员引用第三方DLL程序集的功能,感到甚是高兴!于是我急忙写了个Demo想试试,我 ...

  3. 基于 ASP.NET Core 2.1 的 Razor Class Library 实现自定义错误页面的公用类库

    注意:文中使用的是 razor pages ,建议使用 razor views ,使用 razor pages 有一个小坑,razor pages 会用到 {page} 路由参数,如果应用中也用到了这 ...

  4. ASP.NET Core and .NET Core Library Support

    ASP.NET Core and .NET Core Library Support 详情参见:https://github.com/linezero/NETCoreLibrary/blob/mast ...

  5. ASP.NET Core 1.0 开发记录

    官方资料: https://github.com/dotnet/core https://docs.microsoft.com/en-us/aspnet/core https://docs.micro ...

  6. ASP.NET Core: You must add a reference to assembly mscorlib, version=4.0.0.0

    ASP.NET Core 引用外部程序包的时候,有时会出现下面的错误: The type 'Object' is defined in an assembly that is not referenc ...

  7. ASP.NET Core中的依赖注入(1):控制反转(IoC)

    ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了"标准化&qu ...

  8. ASP.NET Core 1.0中实现文件上传的两种方式(提交表单和采用AJAX)

    Bipin Joshi (http://www.binaryintellect.net/articles/f1cee257-378a-42c1-9f2f-075a3aed1d98.aspx) Uplo ...

  9. Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  10. 来份ASP.NET Core尝尝

    0x01.前言 学习ASP.NET Core也有一段时间了,虽说很多内容知识点还是处于一知半解的状态,但是基本的,还是 略懂一二.如果有错误,还望见谅. 本文还是和之前一样,Demo+在Linux下运 ...

随机推荐

  1. 解决方案 | 在 Tkinter 中导入 pywinauto/pyautogui 时窗口大小发生变化

    上面问题也可以换一个说法,pywinauto/pyautogui 时改变了tkinter的原有的窗口大小.这个问题困扰了我好几天而且网上有这样的问题但是并没有答案,今天摸索出答案给大家分享下.解决方法 ...

  2. ArchSummit回顾:从云原生到实时数据湖,架构如何支撑业务发展

    [点击了解更多网易热点] 数字化.自动化.智能化的主旋律下,架构的进化也在提速.在近日举办的ArchSummit全球架构师峰会上,网易数帆高级技术专家.资深架构师裴斐和网易数帆高级技术专家周劲松分别分 ...

  3. 论如何直接用EF Core实现创建更新时间、用户审计,自动化乐观并发、软删除和树形查询(上)

    前言 数据库并发,数据审计和软删除一直是数据持久化方面的经典问题.早些时候,这些工作需要手写复杂的SQL或者通过存储过程和触发器实现.手写复杂SQL对软件可维护性构成了相当大的挑战,随着SQL字数的变 ...

  4. C# WinForm自制项目模板入坑记

    1. 创建模板配置 1.1 在项目目录中创建.template.config文件夹 1.2 创建一个名为"template.json" 的新文件 { "author&qu ...

  5. ABC349

    A link 其实,有人赢比赛,就有人输比赛,一加一减,不管进行多少场比赛,最后所有人的分数和一定是\(0\). 那么知道\(n-1\)个人的分数和,就可以知道第\(n\)个人的了. 点击查看代码 # ...

  6. 使用 useNuxtData 进行高效的数据获取与管理

    title: 使用 useNuxtData 进行高效的数据获取与管理 date: 2024/7/22 updated: 2024/7/22 author: cmdragon excerpt: 深入讲解 ...

  7. MFC--教你如何使用画刷(2)

    接下来我们用另外一个类CClientDC来实现我们的画线功能. CClientDC是由CDC派生出来的一个类,在函数构造的时候就会去调用GetDC来获得一个句柄,而在析构的时候便调用ReleaseDC ...

  8. 解锁Nginx日志的宝藏:GoAccess——你的实时、交互式Web日志分析神器!

    在当今数字化的时代,网站的流量和用户行为数据就像是一座蕴藏着无尽秘密的宝藏.而如何有效地挖掘和分析这些数据,成为了许多网站管理者和开发者头疼的问题.GoAccess,一款开源的实时Web日志分析工具, ...

  9. 智能家居如何把老款定频空调变成智能“变频”空调#米家#智能家居#HA

    背景 最近长沙的天气暴热,室内达到了34-35度,天气预报最高温度上了40度,这么酷热的天气,离开了空调,基本上就是一身汗,全身湿透,特别难受,然后不得不开启家里的一台将近10年的老式定频空调,输入功 ...

  10. java开发环境安装IDEA+jdk1.8

    一. 需要得安装包 (1)IDEA破解版.zip (2)jdk1.8.0_25.7z 获取方式(免费): (1)       登录-注册:http://resources.kittytiger.cn/ ...