我有一个格式错误的制表符分隔的csv文件
Name AA BB CC AA BB CC
XX5 2 7 8b
YY4 2 6 2
ZZ3 8 21 9
RR2 1 2 6
SS1 6 7 23
应该是这样
Name AA BB CC
XX5 2 7 8b
YY4 2 6 2
ZZ3 8 21 9
RR2 1 2 6
SS1 6 7 23
我无法手动执行此操作,因为行太多了。有没有可以使之自动化的算法?
第一行是标题。
这只是一个示例,实际文件有50列且超过10000行
最佳答案
我不喜欢string.Format
,但也许喜欢下面的东西。请注意,Length == 7
测试在数据结束后不再假设\t
,但是您可以将其替换为空白字符串测试...
static void Main() {
var qry = from line in ReadLines("data.tsv")
let cells = line.Split('\t')
let format = cells.Length == 7 ? "{0}\t{4}\t{5}\t{6}"
: "{0}\t{1}\t{2}\t{3}"
select string.Format(format, cells);
using (var writer = File.CreateText("new.tsv")) {
foreach(string line in qry) {
writer.WriteLine(line);
}
}
}
static IEnumerable<string> ReadLines(string path) {
using (var reader = File.OpenText(path)) {
string line;
while ((line = reader.ReadLine()) != null) {
yield return line;
}
}
}
编辑;简单地删除空白:
static string Join(this IEnumerable<string> data, string delimiter) {
using (var iter = data.GetEnumerator()) {
if (!iter.MoveNext()) return "";
StringBuilder sb = new StringBuilder(iter.Current);
while (iter.MoveNext()) {
sb.Append(delimiter).Append(iter.Current);
}
return sb.ToString();
}
}
static void Main() {
var qry = from line in ReadLines("data.tsv")
let cells = line.Split('\t').Where(s => s != "")
select cells.Join("\t");
using (var writer = File.CreateText("new.tsv")) {
foreach(string line in qry) {
writer.WriteLine(line);
}
}
}
关于c# - 文字处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1677076/