Chiến lược có thể phụ thuộc vào lượng dữ liệu.
- Nếu dữ liệu sẽ phù hợp trong bộ nhớ bạn có thể đọc tất cả các dữ liệu vào một danh sách, sắp xếp nó, và viết nó ra
- Nếu bạn muốn loại bỏ bản sao sử dụng một HashSet thay vì một danh sách
- Nếu nó sẽ không vừa với bộ nhớ, mở tất cả các tệp để đọc, so sánh bản ghi đầu tiên của mỗi tệp và ghi ra mức thấp nhất. Sau đó tiến lên tệp bạn đọc. Lặp lại tất cả các tệp cho đến khi tất cả chúng hết và được ghi vào tệp mới.
- Nếu bạn muốn xóa các bản sao, hãy làm như trên, nhưng bỏ qua bất kỳ bản ghi nào bằng văn bản cuối cùng.
Dưới đây là ví dụ mã đọc N tập tin văn bản được sắp xếp và hợp nhất chúng. Tôi đã không bao gồm kiểm tra trùng lặp, nhưng nó phải dễ thực hiện.
Đầu tiên là lớp trợ giúp.
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; }
}
}
Và sau đó mã để đọc và sáp nhập (nó nên được refactored cho rõ ràng trong sản xuất):
// 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;
}
}
Nguồn
2010-02-18 17:10:34
Có hoặc không có hồ sơ trùng lặp? – Bobby
Điều gì ngăn cản bạn thực hiện sắp xếp trong bộ nhớ và ghi vào một tệp? Nói cách khác, những hạn chế của bạn là gì? –
Tôi muốn bị cám dỗ để nói, tải hoặc chỉ cần nối thêm tất cả 9 tệp và sắp xếp lại. Với chi phí truy cập tập tin tôi không thể nghĩ ra bất kỳ lý do chính đáng để cố gắng xen kẽ các tập tin dữ liệu trong khi bạn đang hợp nhất. Nếu bạn đang xử lý tổng tải bản ghi lớn hơn bộ nhớ có sẵn thì cuộc sống sẽ phức tạp hơn. – Lazarus