c# - 在转换 TXT 文件(C# 或任何其他语言)时处理空记录
问题描述
我一直在尝试解决这个问题很长时间,但我无法解决它。
我需要转换一个 txt 文件,我想用逗号替换空格,但是在某些情况下存在空记录。
我的 TXT 文件如下所示:
POL-45345334234 -963747 -963747 $ KAN 98 HU 554534 2179007 2021 20210127 20210127 -963747
POL-99345552342 628308 423818 $ KAN 98 JU 999898 1402048 2021 20190104 20190208 423818 30 0
如果您看一下,TXT 文件有 15 列,但有些记录并没有填满所有列,只是其中的一些列。
我想获得这样的东西:
POL-45345334234,-963747,-963747,$,KAN,98,HU,554534,2179007,2021,20210127,20210127,-963747,,
POL-99345552342,628308,423818,$,KAN,98,JU,999898,1402048,2021,20190104,20190208,423818,30,0
仔细看看这个:
,,
一个人建议我使用这样的东西:
System.Text.RegularExpressions;
using (StreamWriter sw = new StreamWriter(@"D:\output.csv"))
{
using (var fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
using (var sr = new StreamReader(fs, Encoding.UTF8))
{
string line = String.Empty;
while ((line = sr.ReadLine()) != null)
{
string newline = Regex.Replace(line, @"\s+", ",");
sw.WriteLine(newline);
}
}
}
}
问题是这样做我没有考虑空记录,它并不是真的有用。
我该如何处理这种情况?有什么想法吗?
解决方案
在我看来,线条是固定宽度的,并且列的起始位置都对齐。因此,如果您为与每列对应的每一行获取子字符串,则可以单独修剪每列的空格。
您可以将 Regex 行替换为
string newline = ParseLine(line);
并引入这样的解析函数
string ParseLine(string line)
{
string separator = ",";
int[] starts = new int[] { 0, 22, 36, 43, 47, 53, 57, 60, 71, 91, 96, 105, 121, 130, 140, 142 };
List<string> row = new List<string>();
for (int i = 0; i < starts.Length - 1; i++)
{
row.Add(line.Substring(starts[i], starts[i + 1] - starts[i]).Trim());
}
return String.Join(separator, row);
}
该功能可以更精细,并自动调整到不同的间距,但希望它是一个开始。
推荐阅读
- sql - Oracle CTAS 用特定字符随机填充列
- google-bigquery - BigQuery 节点库针对哪些错误代码重试
- android - 失败 [INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION: 无法解析 /data/app/vmdl1686600827.tmp/base.apk: 损坏的 XML 二进制文件]
- sql - 在 INSERT 查询中增加非主键字段
- eclipse - 在 MacOS 上是否可以将 Intellij IDEA 或 Eclipse 导出为 X Windows 应用程序?
- excel - VBA Vlookup 错误
- python - 使用 Selenium 和 Python 从 xpath 不断变化的元素中抓取文本
- reactjs - 私有路由不重定向到登录页面
- mongodb - 使用 unix 时间戳查询 MongoDB 中的空闲时隙
- java - 关于 Java 中的 showMessageDialog 框