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 に答える