2011-01-18 2 views
0

то, что я хочу сделать, это де-обмануть текстовый файл (против него) на основе разделения. После того, как de-dupe завершил запись в новый файл и сохранит первый результат. Итак, базовый пример. Я думаю, вопрос в том, как вы обманываете текстовый файл в C# на основе разделения строк.Вывод текстового файла C# на основе раскола

Файл 1:
Яблоко | Turnip3234
Яблоко | Tunip22
Fox | dsa34
Черепаха | 3423
Hamster | d34
Fox | sdw2

Результат:
Яблоко | Turnip3234
Fox | dsa34
Черепаха | 3423
Хомяк | d34

+0

В чем Ваш вопрос? –

+0

Вам нужно указать, что представляет собой «обман» и как выбрать, какой из них сохранить. –

+0

C# будет работать, но для чего-то такого простого я мог бы порекомендовать такой инструмент, как Ruby, Python или Perl. Вы не заметите заметной разницы во времени, если только файлы, о которых идет речь, огромны! При этом вы собираетесь использовать структуру данных словаря на любом языке для достижения этого (проверьте, присутствует ли ключ, если он добавлен, иначе пропустите добавление его в словарь), затем для каждой строки в оригинале найдите другую сторону раскола и распечатайте их. – Crisfole

ответ

3
string inputFile; // = ... 
string outputFile; // = ... 
HashSet<string> keys = new HashSet<string>(); 

using (StreamReader reader = new StreamReader(inputFile)) 
using (StreamWriter writer = new StreamWriter(outputFile)) 
{ 
    string line = reader.ReadLine(); 
    while (line != null) 
    { 
     string candidate = line.Split('|')[0]; 
     if (keys.Add(candidate)) 
      writer.WriteLine(line); 

     line = reader.ReadLine(); 
    } 
} 
1

Использование HashSet<string>. Храньте там левую часть линии (все предшествует |).

В каждой строке вызывается hashset.Contains(leftpart), чтобы проверить, является ли эта строка «обманутой».

+0

Справа. Нет необходимости хранить строки, первый «уникальный» можно написать напрямую. –

+0

Да, конечно, вы можете писать напрямую, просто нужно сохранить хешсет. –

+1

@Al: Я уверен, Хенк согласился с вами. –

0

Вы можете создать Dictionary<string,string> где ключ - ваше первое слово, а значение - второе. Затем вы можете просто пройти через все свои линии, разделить их и проверить, произошло ли первое слово в Keys, и добавьте эту пару, если это не так.

0

Это всегда будет использовать первое найденное значение (и оно не проверено, но концепции верны).

Dictionary<String, String> dupeMap = new Dictionary<String, String>(); 
foreach (string line in File.Readlines("foo.txt")) { 
    key = line.Split("|")[0]; 
    if (!dupeMap.ContainsKey(key)) { 
     dupeMap.Add(key, line); 
    } 
} 

Тогда вы можете написать их всех перебором Dictionary, хотя это не стабильным, потому что вы не можете быть уверены, чтобы получить строки обратно в порядке.

using (TextWriter tw = new StreamWriter("foo.txt")) { 
    foreach (string key in dupeMap.Keys()) { 
     tw.WriteLine(dupeMap[key]); 
    } 
} 
0

Простое решение является только добавить значения, которые вы еще не встречались.

var allLines = File.ReadAllLines(@"c:\test.txt"); 

    Dictionary<string, string> allUniques = new Dictionary<string, string>(); 

    foreach(string s in allLines) 
    { 
     var chunks = s.Split('|'); 
     if (!allUniques.ContainsKey(chunks[0])) 
     { 
      allUniques.Add(chunks[0], s); 
     }  
    } 

    File.WriteAllLines(@"c:\test2.txt", allUniques.Values.ToArray()); 
Смежные вопросы