我有一个格式错误的制表符分隔的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/

10-10 00:58