使用TextFieldParser读取CSV时无法将空条目替换为"0"的问题
CSV读取中空值替换为"0"的问题
我是C#新手,正在从CSV文件读取两列数据并生成IEnumerable<string[]>,现有代码可正常运行,但遇到整行空值的情况时,希望把空单元格的""替换成字符串"0",调试时空单元格显示为""。
表格示例
| Lat | Lng |
|---|---|
| 51.452703 | 36.622065 |
| 28.721829 | 41.013330 |
原始CSV数据格式
Col1,Col2,Col3,Col4,Col5,Col6,Lat,Lng,Col9 one street,300,,,GUANGDONG,CN,,,
现有可运行代码
public static IEnumerable<string[]> ReadCSV(string path) { using (var parser = new TextFieldParser(path)) { parser.Delimiters = new string[] { "," }; parser.ReadFields(); // 跳过表头 while (!parser.EndOfData) { yield return parser.ReadFields().Skip(6).Take(2).Reverse().ToArray(); } } }
尝试的错误代码及问题
我尝试替换空值的代码如下,但报错:string cannot be of zero length, parameter name oldValue,明白是搜索内容的问题,但不知道如何解决:
public static IEnumerable<string[]> ReadCSV(string path) { string[] test; using (var parser = new TextFieldParser(path)) { parser.Delimiters = new string[] { "," }; parser.ReadFields(); // 跳过表头 while (!parser.EndOfData) { test = parser.ReadFields().Skip(6).Take(2).Reverse().ToArray(); var replacedNames = test.Select(x => x.Replace("", "0")).ToArray(); yield return replacedNames; } } }
解决方案
报错原因是string.Replace("", "0")的第一个参数为空字符串,而Replace方法要求oldValue不能是空值。正确做法是先判断字符串是否为空(或空白),再替换为"0"。
修改后的代码如下:
public static IEnumerable<string[]> ReadCSV(string path) { using (var parser = new TextFieldParser(path)) { parser.Delimiters = new string[] { "," }; parser.ReadFields(); // 跳过表头 while (!parser.EndOfData) { var fields = parser.ReadFields().Skip(6).Take(2).Reverse(); // 替换空字符串或null为"0" var processedFields = fields.Select(x => string.IsNullOrEmpty(x) ? "0" : x).ToArray(); yield return processedFields; } } }
补充说明
- 如果需要同时处理仅含空格的空白字符串,可将判断条件改为
string.IsNullOrWhiteSpace(x)。 - 代码中直接对字段流进行处理,无需额外定义临时数组,简化了逻辑。
内容的提问来源于stack exchange,提问作者CGarden
相关产品推荐
相关产品推荐

