La strategia potrebbe dipendere dalla quantità di dati.
- Se i dati si inserisce in memoria è possibile leggere tutti i dati in un elenco, ordinare, e scriverlo fuori
- Se si desidera rimuovere i duplicati utilizzare un HashSet invece di una lista
- Se lo farà non si adatta alla memoria, apre tutti i file per la lettura, confronta il primo record di ogni file e scrive il più basso. Quindi fai avanzare il file che hai letto. Loop su tutti i file fino a quando non sono tutti esauriti e scritti nel nuovo file.
- Se si desidera rimuovere i duplicati, fare come sopra, ma saltare un record uguale all'ultimo scritto.
Ecco un esempio di codice che legge in N file di testo ordinati e li unisce. Non ho incluso il controllo duplicato, ma dovrebbe essere facile da implementare.
Prima una classe di supporto.
class MergeFile : IEnumerator<string>
{
private readonly StreamReader _reader;
public MergeFile(string file)
{
_reader = File.OpenText(file);
Current = _reader.ReadLine();
}
public string Current { get; set; }
public void Dispose()
{
_reader.Close();
}
public bool MoveNext()
{
Current = _reader.ReadLine();
return Current != null;
}
public void Reset()
{
throw new NotImplementedException();
}
object IEnumerator.Current
{
get { return Current; }
}
}
E poi codice per leggere e fondere (dovrebbe essere riscritta per chiarezza in produzione):
// Get the file names and instantiate our helper class
List<IEnumerator<string>> files = Directory.GetFiles(@"C:\temp\files", "*.txt").Select(file => new MergeFile(file)).Cast<IEnumerator<string>>().ToList();
List<string> result = new List<string>();
IEnumerator<string> next = null;
while (true)
{
bool done = true;
// loop over the helpers
foreach (var mergeFile in files)
{
done = false;
if (next == null || string.Compare(mergeFile.Current, next.Current) < 1)
{
next = mergeFile;
}
}
if (done) break;
result.Add(next.Current);
if (!next.MoveNext())
{
// file is exhausted, dispose and remove from list
next.Dispose();
files.Remove(next);
next = null;
}
}
fonte
2010-02-18 17:10:34
Con o senza record duplicati? – Bobby
Cosa ti impedisce di fare un ordinamento in-memory e scrivere su un file? In altre parole, quali sono i tuoi vincoli? –
Sarei tentato di dire, caricare o semplicemente aggiungere tutti e 9 i file e riordinarli. Considerato il sovraccarico dell'accesso ai file, non riesco a pensare a nessuna buona ragione per provare a inserire i file di dati durante l'unione. Se si ha a che fare con un carico record totale maggiore della memoria disponibile, allora la vita è più complessa. – Lazarus