User:Dart Raiden/Дублирующиеся строки: Difference between revisions

From Miranda NG
Jump to navigation Jump to search
No edit summary
No edit summary
Line 3: Line 3:
Для нахождения дублирующихся строк можно воспользоваться пакетным файлом (.bat), взятым с http://metaspamer.blogspot.ru/2011/12/programma-dlia-udaleniia-odinakovykh.html и немного измененным под наши нужды.
Для нахождения дублирующихся строк можно воспользоваться пакетным файлом (.bat), взятым с http://metaspamer.blogspot.ru/2011/12/programma-dlia-udaleniia-odinakovykh.html и немного измененным под наши нужды.
Необходимо передать батнику файл аргументом (берем свой текстовый файл и перетаскивам его мышкой на smf_sortcleaner.bat в проводнике Windows), все остальное он сам сделает и создаст в папке с собой файл, содержаший дублирующиеся строки. А если запустить без аргументов, то он обработает все .txt в папке с собой.
Необходимо передать батнику файл аргументом (берем свой текстовый файл и перетаскивам его мышкой на smf_sortcleaner.bat в проводнике Windows), все остальное он сам сделает и создаст в папке с собой файл, содержаший дублирующиеся строки. А если запустить без аргументов, то он обработает все .txt в папке с собой.
Требует для работы .NET Framework не ниже 2 версии.
Требует для работы .NET Framework не ниже 2 версии.
После этого удобно пройтись поиском по полученным файлам и отыскать все строки, содержащие символ "[". Это и будут искомые "лишние" строки, присутствие которых в ленгпаке бессмысленно.
После этого удобно пройтись поиском по полученным файлам и отыскать все строки, содержащие символ "[". Это и будут искомые "лишние" строки, присутствие которых в ленгпаке бессмысленно.
Содержимое smf_sortcleaner.bat:
Содержимое smf_sortcleaner.bat:
<nowiki>
/*
@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
<nowiki>/*</nowiki><br>
//metaspamer.blogspot.com
@echo off && cls<br>
%WinDir%\Microsoft.NET\Framework\v2.0.50727\csc.exe /nologo /out:"%~0.exe" %0<br>
"%~0.exe" %1<br>
del "%~0.exe"<br>
exit<br>
<nowiki>*/</nowiki>


using System;
using System;<br>
using System.Collections.Generic;
using System.Collections.Generic;<br>
using System.IO;
using System.IO;<br>
using System.Text;
using System.Text;<br>


namespace spicemustflow_sortcleaner
namespace spicemustflow_sortcleaner<br>
{
{<br>
    class Program
class Program<br>
    {
{<br>
        static string GetFilename(string nameWithoutExtension, bool uniq)
static string GetFilename(string nameWithoutExtension, bool uniq)<br>
        {
{<br>
            int n = 1;
int n = 1;<br>
            string outputFile = string.Empty;
string outputFile = string.Empty;<br>
            while (true)
while (true)<br>
            {
{<br>
                outputFile = string.Format("{0}_{1}{2}.txt",
outputFile = string.Format("{0}_{1}{2}.txt",<br>
                    nameWithoutExtension, uniq ? "uniques" : "duplicates",
nameWithoutExtension, uniq ? "uniques" : "duplicates",<br>
                    n > 1 ? n.ToString() : string.Empty);
n > 1 ? n.ToString() : string.Empty);<br>
                if (File.Exists(outputFile)) n++;
if (File.Exists(outputFile)) n++;<br>
                else break;
else break;<br>
            }
}<br>
            return outputFile;
return outputFile;<br>
        }
}<br>


        static void Main(string[] args)
static void Main(string[] args)<br>
        {
{<br>
            string path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\";
string path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\";<br>
            string[] filelist = null;
string[] filelist = null;<br>
            if (args.Length == 0) filelist = Directory.GetFiles(path, "*.txt", SearchOption.TopDirectoryOnly);
if (args.Length == 0) filelist = Directory.GetFiles(path, "*.txt", SearchOption.TopDirectoryOnly);<br>
            else filelist = args;
else filelist = args;<br>


            foreach (string filename in filelist)
foreach (string filename in filelist)<br>
            {
{<br>
                Encoding enc = Encoding.Default;
Encoding enc = Encoding.Default;<br>
                using (FileStream fs = File.OpenRead(filename))
using (FileStream fs = File.OpenRead(filename))<br>
                {
{<br>
                    byte[] data = new byte[3];
byte[] data = new byte[3];<br>
                    while (fs.Read(data, 0, data.Length) > 0)
while (fs.Read(data, 0, data.Length) > 0)<br>
                        if (data[0] == 0xef && data[1] == 0xbb && data[2] == 0xbf)
if (data[0] == 0xef && data[1] == 0xbb && data[2] == 0xbf)<br>
                        {
{<br>
                            enc = Encoding.UTF8;
enc = Encoding.UTF8;<br>
                            break;
break;<br>
                        }
}<br>
                        else
else<br>
                        {
{<br>
                            enc = Encoding.GetEncoding(1251);
enc = Encoding.GetEncoding(1251);<br>
                            break;
break;<br>
                        }
}<br>
                }
}<br>


                Console.Write("loading {0}..\n", filename);
Console.Write("loading {0}..\n", filename);<br>
                string[] input = File.ReadAllLines(filename, enc);
string[] input = File.ReadAllLines(filename, enc);<br>
                if (input.Length > 0)
if (input.Length > 0)<br>
                {
{<br>
                    Console.Write("sorting..\n");
Console.Write("sorting..\n");<br>
                    Array.Sort(input);
Array.Sort(input);<br>
                    List<string> uniques = new List<string>();
List<string> uniques = new List<string>();<br>
                    List<string> duplicates = new List<string>();
List<string> duplicates = new List<string>();<br>
                    Console.Write("deleting duplicates..\n");
Console.Write("deleting duplicates..\n");<br>
                    uniques.Add(input[0]);
uniques.Add(input[0]);<br>
                    for (int i = 1; i < input.Length; i++)
for (int i = 1; i < input.Length; i++)<br>
                        if (input[i] != input[i - 1])
if (input[i] != input[i - 1])<br>
                            uniques.Add(input[i]);
uniques.Add(input[i]);<br>
                        else
else<br>
                            duplicates.Add(input[i]);
duplicates.Add(input[i]);<br>


                    Console.Write("\nsaving..\n");
Console.Write("\nsaving..\n");<br>
                    File.WriteAllLines(path + GetFilename(Path.GetFileNameWithoutExtension(filename), false), duplicates.ToArray(), enc);
File.WriteAllLines(path + GetFilename(Path.GetFileNameWithoutExtension(filename), false), duplicates.ToArray(), enc);<br>
                    Console.Write("\n\n");
Console.Write("\n\n");<br>
                }
}<br>
            }
}<br>
        }
}<br>
    }
}<br>
}
}
</nowiki>

Revision as of 02:25, 22 June 2014

В пределах перевода конкретного плагина исходные (англоязычные) строки дублироваться не должны. В этом случае Миранда будет использовать первый встреченный вариант перевода.

Для нахождения дублирующихся строк можно воспользоваться пакетным файлом (.bat), взятым с http://metaspamer.blogspot.ru/2011/12/programma-dlia-udaleniia-odinakovykh.html и немного измененным под наши нужды. Необходимо передать батнику файл аргументом (берем свой текстовый файл и перетаскивам его мышкой на smf_sortcleaner.bat в проводнике Windows), все остальное он сам сделает и создаст в папке с собой файл, содержаший дублирующиеся строки. А если запустить без аргументов, то он обработает все .txt в папке с собой.

Требует для работы .NET Framework не ниже 2 версии.

После этого удобно пройтись поиском по полученным файлам и отыскать все строки, содержащие символ "[". Это и будут искомые "лишние" строки, присутствие которых в ленгпаке бессмысленно. Содержимое smf_sortcleaner.bat:

/*
@echo off && cls
%WinDir%\Microsoft.NET\Framework\v2.0.50727\csc.exe /nologo /out:"%~0.exe" %0
"%~0.exe" %1
del "%~0.exe"
exit
*/

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 outputFile = string.Empty;
while (true)
{
outputFile = string.Format("{0}_{1}{2}.txt",
nameWithoutExtension, uniq ? "uniques" : "duplicates",
n > 1 ? n.ToString() : string.Empty);
if (File.Exists(outputFile)) n++;
else break;
}
return outputFile;
}

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<string> uniques = new List<string>();
List<string> duplicates = new List<string>();
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), false), duplicates.ToArray(), enc);
Console.Write("\n\n");
}
}
}
}
}