2

私はtext1.txt以下のような内容を持っています:

longitude,latt,u,70772,xxxx
31, 121, -10.2
31, 122, -20.9
31, 123, 40.8
.
.
44, 131, -44.1

私はtext2.txt以下のような内容を持っています:

longitude,latt,v,70772,xxxx
31, 121, 12.1
31, 122, 32.4
31, 123, -2.5
.
.
44, 131, 7.3

ご覧のとおり、いくつかの共通点がtext1.txtあります。text2.txt

第 1 の共通点: 重要でない情報が含まれているため、各テキスト ファイルの最初の行はスキップする必要があります。

2 番目の共通点: 各テキスト ファイルには、同じ経度と緯度の値が含まれています。

31 , 121 , x
31 , 122 , x
31 , 123 , x
.
.
44 , 131 , x

私の目的は、結合text1.txttext2.txtresult.txt次の結果を得ることです。

31, 121, -10.2, 12.1
31, 121, -20.9, 32.4
31, 123, 40.8, -2.5
.
.
44, 131, -44.1, 7.3

このソースMergeTwoTextFileを参照すると、2 つのテキスト ファイルをマージする方法は既にわかっています。しかし、私が知らないのは、特定の条件で2つのテキストファイルをマージする方法です。

concatのようなことができるといいのですがdistict、何か考えはありますか?

更新: 3 つの UI ボタン

ここに画像の説明を入力

ファイルを開くボタンのコード

private void toolStripBtnOpenV_Click(object sender, EventArgs e)
{
        toolStripBtnOpenV.Enabled = false;

        openFileDialog1.FileName = "";

        openFileDialog1.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*";

        if (openFileDialog1.ShowDialog() != DialogResult.OK)
            return;

        v_filePath = openFileDialog1.FileName;

        if (toolStripBtnOpenU.Enabled == false)
        {
            toolStripBtnMerge.Enabled = true;
        }
}

MergeUV button_click イベント内で、最初の行を次のように変更することを除いて、SamiHuutoniemi が提案したようにします。

List<string> filelist = new List<string>() { v_filePath , u_filePath };

ファイルサイズが 5MB を超える場合、出力ファイルを書き込むのに最低 20 分かかります。

4

3 に答える 3

2

このようなもの?

var file1 = File.ReadAllLines("path1");
var file2 = File.ReadAllLines("path2");

var result = new List<string>();

//Skip line 0
for (int i = 1; i < file1.Length; i++)
{
    //Get the values from each correseponding file
    var file1Values  = file1[i].Split(',').Select(v => v.Trim());
    var file2Values  = file2[i].Split(',').Select(v => v.Trim());

    //Get distinct values & join
    result.Add(string.Join(",", file1Values.Union(file2Values)));
}

File.WriteAllLines("resultpath", result);
于 2013-06-05T15:47:55.073 に答える
2

両方のテキストファイルを読み取り、データをリストとして保存できますTuple<int, int, List<double>>(2つのintを共有する2つのタプルがないという意味で、タプルは「一意」です)。次に、すべてのタプルを独自の形式で出力するテキストファイルを出力します。

これは、あなたがやりたいと思うことを達成します。

List<string> filelist = new List<string>() { "text1.txt", "text2.txt" };
List<Tuple<int, int, List<double>>> dataList = new List<Tuple<int, int, List<double>>>();

foreach (var file in filelist)
{
    string line;
    using (TextReader tr = new StreamReader(file))
    {
        tr.ReadLine();  //skip header
        while ((line = tr.ReadLine()) != null)
        {
            var tokens = line.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
            int longitude = int.Parse(tokens[0]);
            int latitude = int.Parse(tokens[1]);
            double value = double.Parse(tokens[2], CultureInfo.InvariantCulture);

            Tuple<int, int, List<double>> t = dataList.Where(x => (int)x.Item1 == longitude && (int)x.Item2 == latitude).FirstOrDefault();
            if (t == null)
            {
                dataList.Add(new Tuple<int, int, List<double>>(longitude, latitude, new List<double>() { value }));
            }
            else
            {
                t.Item3.Add(value);
            }
        }
    }
}

using (TextWriter tw = new StreamWriter("output.txt"))
{
    foreach (var t in dataList)
    {
        StringBuilder sb = new StringBuilder();
        sb.Append(String.Format("{0}, {1}, ", t.Item1, t.Item2));
        foreach (var value in t.Item3)
        {
            sb.Append(String.Format("{0}, ", value));
        }

        tw.WriteLine(sb.ToString());
    }
}
于 2013-06-05T15:44:38.633 に答える
0

それぞれの最初の行なしでそれらをマージするには、次のワンライナーを試すことができます。

File.WriteAllLines("result.txt", File.ReadLines("text1.txt").Skip(1).Concat(File.ReadLines("text2.txt").Skip(1)));

純粋な行ごとの比較レベルでそれらを区別する必要がある場合:

File.WriteAllLines("result.txt", File.ReadLines("text1.txt").Skip(1).Concat(File.ReadLines("text2.txt").Skip(1)).Distinct());
于 2013-06-05T15:47:47.580 に答える