1

我有一个制表符分隔的文件,其中一些字符串包含一个ý需要替换为\t. 此外,字符串总共需要包含 4 个制表符,任何额外的制表符都附加到末尾。例如,字符串:

1234ý5678
1234
ý1234ý5678

应该看起来像

1234\t5678\t\t\t
1234\t\t\t\t
\t1234\t5678\t\t

这是我到目前为止所拥有的:

string[] input_file = (string[])(e.Data.GetData(DataFormats.FileDrop));
string output_file = @"c:\filename.txt";

foreach (string file in input_file)
{
    string[] lines = File.ReadAllLines(file);

    for (int i = 0; i < lines.Length; i++)
    {
        string line = lines[i];

        string[] values = line.Split('\t');

        //look at each value in values, replace any ý with a tab, and add
                    //tabs at the end of the value so there are 4 total

        lines[i] = String.Join("\t", values);

    }
    File.WriteAllLines(output_file, lines);
}

编辑:一些澄清 - 整行可能如下所示:

331766*ALL1 16ý7    14561ý8038  14560ý8037  ausername  11:54:05  12 Nov 2007

我需要查看组成该行的每个字符串,并将任何 ý 替换为 \t,并在末尾添加 \t,因此每个字符串总共有 4 个。结果应该如下所示:

331766*ALL1 16\t7\t\t\t 14561\t8038\t\t\t   14560\t8037\t\t\t   ausername  11:54:05  12 Nov 2007
4

3 回答 3

1

你要做的是:

  1. 使用 \t 作为分隔符将每一行拆分为字符串。

  2. 遍历字符串。

  3. 对于每个字符串,用 \t 替换 ý。

  4. 现在计算字符串中 \t 的数量,并根据需要添加额外的 \t。

这是一些代码:

string[] lines = System.IO.File.ReadAllLines(input_file);
var result = new List<string>();
foreach(var line in lines)
{
    var strings = line.Split('\t');
    var newLine = "";
    foreach(var s in strings)
    {
        var newString = s.Replace('ý','\t');
        var count = newString.Count(f=>f=='\t');
        if (count<4)
            for(int i=0; i<4-count; i++)
                newString += "\t";
        newLine += newString + "\t";
    }
    result.Add(newLine);
}
File.WriteAllLines(output_file, result);

使用 StringBuilder 可能会更好地优化速度,但这是一个好的开始。

于 2013-03-26T17:59:13.010 回答
1
private static string SplitAndPadded(string line, string joinedWith = "\t", char splitOn = 'ý')
{
    // 4 required splits yields 5 items ( 1 | 2 | 3 | 4 | 5 )
    // could/should be a parameter; this allowed for the cleaner comment
    const int requiredItems = 5;

    // the empty string case
    var required = Enumerable.Repeat(string.Empty, requiredItems);

    // keep empty items; 3rd test case
    var parts = line.Split(new[] { splitOn });

    // this will exclude items when parts.Count() > requiredItems
    return string.Join(joinedWith, parts.Concat(required).Take(requiredItems));
}


//usage
// .Select(SplitAndPadded) may need to be .Select(line => SplitAndPadded(line))
var lines = File.ReadAllLines(file).Select(SplitAndPadded).ToArray();
File.WriteAllLines(outputFile, lines);

// if input and output files are different, you don't need the ToArray (you can stream)
于 2013-03-26T18:16:24.943 回答
1

尝试这个:

string[] lines = System.IO.File.ReadAllLines(input_file);

for (int i = 0; i < lines.Length; i++)
{
    string line = lines[i];
    line = line.Replace("ý", "\t");
    int n = line.Split(new string[] { "\t" }, StringSplitOptions.None).Count()-1;
    string[] temp = new string[4 - n ];
    temp = temp.Select(input => "\t").ToArray();
    line += string.Join(string.Empty, temp);
    lines[i] = line;
}

System.IO.File.WriteAllLines(output_file, lines);
于 2013-03-26T18:17:13.863 回答