User:Dart Raiden/Дублирующиеся строки: Difference between revisions
Dart Raiden (talk | contribs) Created page with "В пределах перевода ''конкретного плагина'' исходные (англоязычные) строки дублироваться не дол..." |
formatting |
||
| (2 intermediate revisions by one other user not shown) | |||
| Line 1: | Line 1: | ||
В пределах перевода ''конкретного плагина'' исходные (англоязычные) строки дублироваться не должны. В этом случае Миранда будет использовать первый встреченный вариант перевода. | В пределах перевода ''конкретного плагина'' исходные (англоязычные) строки дублироваться не должны. В этом случае Миранда будет использовать первый встреченный вариант перевода. | ||
Для нахождения дублирующихся строк можно воспользоваться | Для нахождения дублирующихся строк можно воспользоваться пакетным файлом (.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: | |||
<pre style="overflow:auto;"> | |||
/* | |||
@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"); | |||
} | |||
} | |||
} | |||
} | |||
} | |||
</pre> | |||
Latest revision as of 21:11, 30 December 2015
В пределах перевода конкретного плагина исходные (англоязычные) строки дублироваться не должны. В этом случае Миранда будет использовать первый встреченный вариант перевода.
Для нахождения дублирующихся строк можно воспользоваться пакетным файлом (.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");
}
}
}
}
}