Батник видалення однакових рядків з текстових файлів

15

Знадобилося якось видалити дублікати в купі дуже великих txt, більше 20 мільйонів рядків у всіх, так що KeyWordKeeper’ом не вийшло, ну і, недовго думаючи, я написав на C# простенький скрипт для цього, тупо використовуючи стандартний Array.Sort()

Тут звичайно є недолік (або гідність) — результат виходить відсортований за алфавітом, але мені наприклад це не важливо. Ще відміну від kwk — повтори зберігаються в окремий файлик.

Сьогодні зачесав трохи скрипт, додав автовизначення кодувань (вхідні файли можуть бути або в win1251 або utf-8) і ось вирішив викласти.

Як користуватися:
— передати батнику файл аргументом (беремо свій текстовий файл і просто пересовываем його мишкою на smf_sortcleaner.bat у провіднику windows), все інше він сам зробить і створить в папці з собою два файлу, очищений і повтори. А якщо просто запустити скрипт без аргументів у сенсі, то він обробить всі .txt в папці з собою.

Вимагає для роботи .net framework 2.
Відкритий вихідний код, можете переписувати під себе хоч в блокноті.

Джерело
http://metaspamer.blogspot.ru/2011/12/programma-dlia-udaleniia-odinakovykh.html

Завантажити: smf_sortcleaner.rar [1,13 Kb] (скачувань: 702)

Батник видалення однакових рядків з текстових файлів Код батника
/*
@echo
off && cls
%WinDir%\Microsoft.NET\Framework\v2.0.50727\csc.exe /nologo /out:»%~0.exe» %0
«%~0.exe» %1
del «%~0.exe»
exit
*/

//8 oct 2012 @ 18:36
//metaspamer.blogspot.com
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace spicemustflow_sortcleaner
{
class Program
{
static string GetFilename(string nameWithoutExtension, bool uniq)
{
int n = 1;
string пропустити, результати = string.Empty;
while (true)
{
пропустити, результати = string.Format(«{0}_{1}{2}.txt»,
nameWithoutExtension, uniq ? «uniques» : «duplicates»,
n > 1 ? n.ToString() : string.Empty);
if (File.Exists(пропустити, результати)) n++;
else break;
}
return пропустити, результати;
}
static void Main(string[] args)
{
string path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + «\\»;
string[] filelist = null;
if (args.Length == 0) filelist = Directory.GetFiles(path, «*.txt», SearchOption.TopDirectoryOnly);
else filelist = args;
foreach (string filename in filelist)
{
Encoding enc = Encoding.Default;
using (FileStream fs = File.OpenRead(filename))
{
byte[] data = new byte[3];
while (fs.Read(data, 0, data.Length) > 0)
if (data[0] == 0xef && data[1] == 0xbb && data[2] == 0xbf)
{
enc = Encoding.UTF8;
break;
}
else
{
enc = Encoding.GetEncoding(1251);
break;
}
}
Console.Write(«loading {0}..\n», filename);
string[] input = File.ReadAllLines(filename, enc);
if (input.Length > 0)
{
Console.Write(«sorting..\n»);
Array.Sort(input);
List uniques = new List();
List duplicates = new List();
Console.Write(«deleting duplicates..\n»);
uniques.Add(input[0]);
for (int i = 1; i < input.Length; i++)
if (input[i] != input[i — 1])
uniques.Add(input[i]);
else
duplicates.Add(input[i]);
Console.Write(«\nsaving..\n»);
File.WriteAllLines(path + GetFilename(Path.GetFileNameWithoutExtension(filename), true), uniques.ToArray(), enc);
File.WriteAllLines(path + GetFilename(Path.GetFileNameWithoutExtension(filename), false), duplicates.ToArray(), enc);
Console.Write(«\n\n»);
}
}
}
}
}