Вы можете использовать Pattern pattern = Pattern.compile( "[^<'tagname'/>]" );
Вот пример PowerShell:
gc file.txt | select -Skip 2 | % { $_.ToCharArray() } | sort -CaseSensitive -Unique
который производит:
D
Y
a
b
o
Мне нравится этот, легко читать.
Править: Вот более быстрая версия:
$letters = @{} ; gc file.txt | select -Skip 2 | % { $_.ToCharArray() } | % { $letters[$_] = $true } ; $letters.Keys
Где C:/data.txt
содержит 454 863 строки семи случайных буквенных символов, следующий код
using System;
using System.IO;
using System.Collections;
using System.Diagnostics;
namespace ConsoleApplication {
class Program {
static void Main(string[] args) {
FileInfo fileInfo = new FileInfo(@"C:/data.txt");
Console.WriteLine(fileInfo.Length);
Stopwatch sw = new Stopwatch();
sw.Start();
Hashtable table = new Hashtable();
StreamReader sr = new StreamReader(@"C:/data.txt");
while (!sr.EndOfStream) {
char c = Char.ToLower((char)sr.Read());
if (!table.Contains(c)) {
table.Add(c, null);
}
}
sr.Close();
foreach (char c in table.Keys) {
Console.Write(c);
}
Console.WriteLine();
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
}
}
}
производит вывод
4093767
mytojevqlgbxsnidhzupkfawr
c
889
Press any key to continue . . .
, первая строка вывода говорит Вам число байтов в C:/data.txt
(454,863 * (7 + 2) = 4 093 767 байтов). Следующие две строки вывода являются уникальными символами в C:/data.txt
(включая новую строку). Последняя строка вывода говорит Вам количество миллисекунд, которые код взял для выполнения на Pentium 4 на 2,80 ГГц.
Этот ответ вышеупомянутое использование словаря.
Если так, код, представленный там, может быть оптимизирован немного, начиная с документация Python состояния:
Лучше думать о словаре как о незаказанном наборе ключа: пары значения, с требованием, чтобы ключи были уникальны (в рамках одного словаря).... При хранении использования ключа, который уже используется, о старом значении, связанном с тем ключом, забывают.
Поэтому эта строка кода может быть удалена, так как ключи словаря всегда будут уникальны так или иначе:
if character not in letters:
И это должно сделать его немного быстрее.
Быстрое и грязное решение с помощью grep (принятие имени файла является "файлом"):
for char in a b c d e f g h i j k l m n o p q r s t u v w x y z; do
if [ ! -z "`grep -li $char file`" ]; then
echo -n $char;
fi;
done;
echo
я, возможно, сделал это остротой, но просто хочу помочь читать.
(РЕДАКТИРОВАНИЕ: забыл, что-i переключаются на grep)
Хорошо мой друг, я думаю, что это - то, что Вы имели в виду.... По крайней мере, это - версия Python!!!
f = open("location.txt", "r") # open file
ll = sorted(list(f.read().lower())) #Read file into memory, split into individual characters, sort list
ll = [val for idx, val in enumerate(ll) if (idx == 0 or val != ll[idx-1])] # eliminate duplicates
f.close()
print "Unique Characters: {%s}" % "".join(ll) #print list of characters, carriage return will throw in a return
Это не выполняет итерации через каждый символ, это относительно коротко также. Вы не хотели бы открывать файл на 500 МБ с ним (в зависимости от Вашей RAM), но для более коротких файлов это интересно :)
я также должен добавить свое заключительное нападение!!!! По общему признанию я устранил две строки при помощи стандартного входа вместо файла, я также уменьшил активный код с 3 строк до 2. В основном, если я заменил ll в строке печати с выражением от строки выше его, у меня, возможно, были 1 строка активного кода и одна строка импорта..... Так или иначе теперь мы весело проводим время :)
import itertools, sys
# read standard input into memory, split into characters, eliminate duplicates
ll = map(lambda x:x[0], itertools.groupby(sorted(list(sys.stdin.read().lower()))))
print "Unique Characters: {%s}" % "".join(ll) #print list of characters, carriage return will throw in a return
Python с помощью словаря. Я не знаю, почему люди так связываются с наборами или списками для содержания материала. Предоставленный набор, вероятно, более эффективно, чем словарь. Однако оба, как предполагается, не торопятся для доступа к объектам. И оба выполненных круга вокруг списка, где для каждого символа Вы ищете список, чтобы видеть, находится ли символ уже в списке или нет. Также Списки и Словари создаются в Python datatatypes, что все должны использовать все время. Таким образом, даже если установленный не приходит на ум, словарь должен.
file = open('location.txt', 'r')
letters = {}
for line in file:
if line == "":
break
for character in line.strip():
if character not in letters:
letters[character] = True
file.close()
print "Unique Characters: {" + "".join(letters.keys()) + "}"
Решение C. По общему признанию это не является самым быстрым для кодирования решения в мире. Но так как это уже кодируется и может быть вырезано и вставлено, я думаю, что это рассчитывает как "быстро для реализации" для плаката :) Я на самом деле не видел решений C, таким образом, я хотел отправить один для чистого садистского удовольствия :)
#include<stdio.h>
#define CHARSINSET 256
#define FILENAME "location.txt"
char buf[CHARSINSET + 1];
char *getUniqueCharacters(int *charactersInFile) {
int x;
char *bufptr = buf;
for (x = 0; x< CHARSINSET;x++) {
if (charactersInFile[x] > 0)
*bufptr++ = (char)x;
}
bufptr = '\0';
return buf;
}
int main() {
FILE *fp;
char c;
int *charactersInFile = calloc(sizeof(int), CHARSINSET);
if (NULL == (fp = fopen(FILENAME, "rt"))) {
printf ("File not found.\n");
return 1;
}
while(1) {
c = getc(fp);
if (c == EOF) {
break;
}
if (c != '\n' && c != '\r')
charactersInFile[c]++;
}
fclose(fp);
printf("Unique characters: {%s}\n", getUniqueCharacters(charactersInFile));
return 0;
}
Попробуйте этот файл JSDB Javascript (включает механизм JavaScript в браузер Firefox):
var seenAlreadyMap={};
var seenAlreadyArray=[];
while (!system.stdin.eof)
{
var L = system.stdin.readLine();
for (var i = L.length; i-- > 0; )
{
var c = L[i].toLowerCase();
if (!(c in seenAlreadyMap))
{
seenAlreadyMap[c] = true;
seenAlreadyArray.push(c);
}
}
}
system.stdout.writeln(seenAlreadyArray.sort().join(''));
Python, не используя набор.
file = open('location', 'r')
letters = []
for line in file:
for character in line:
if character not in letters:
letters.append(character)
Альтернативное решение с помощью удара:
sed "s/./\l\0\n/g" inputfile | sort -u | grep -vc ^$
РЕДАКТИРОВАНИЕ Извините, я на самом деле неправильно читал вопрос. Вышеупомянутый код количества уникальные символы. Просто исключение эти c
переключатель в конце, очевидно, добивается цели, но затем, это решение не имеет никакого реального преимущества для saua's (тем более, что он теперь использует тот же sed
шаблон вместо явных получений).
в C++ я сначала циклично выполнился бы через буквы в алфавите, затем выполняет strchr () на каждом с файлом как строка. это скажет Вам, если та буква будет существовать, то просто добавляют его к списку.
cat yourfile |
perl -e 'while(<>){chomp;$k{$_}++ for split(//, lc $_)}print keys %k,"\n";'
Алгоритм: Хлебают файл в память.
Create an array of unsigned ints, initialized to zero.
Iterate though the in memory file, using each byte as a subscript into the array.
increment that array element.
Discard the in memory file
Iterate the array of unsigned int
if the count is not zero,
display the character, and its corresponding count.
Очень быстрое решение состояло бы в том, чтобы сделать маленькую программу C, которая читает ее стандартный вход, делает агрегирование и выкладывает результат.
, Почему произвольное ограничение, что Вам нужен "сценарий", который делает это?
, Что такое точно сценарий так или иначе?
Python сделал бы?
Если так, затем это - одно решение:
import sys;
s = set([]);
while True:
line = sys.stdin.readline();
if not line:
break;
line = line.rstrip();
for c in line.lower():
s.add(c);
print("".join(sorted(s)));
Python w/sets (быстрый и грязный)
s = open("data.txt", "r").read()
print "Unique Characters: {%s}" % ''.join(set(s))
Python w/sets (с более хорошим выводом)
import re
text = open("data.txt", "r").read().lower()
unique = re.sub('\W, '', ''.join(set(text))) # Ignore non-alphanumeric
print "Unique Characters: {%s}" % unique
Быстрая и грязная программа C это ослепительно быстро:
#include <stdio.h>
int main(void)
{
int chars[256] = {0}, c;
while((c = getchar()) != EOF)
chars[c] = 1;
for(c = 32; c < 127; c++) // printable chars only
{
if(chars[c])
putchar(c);
}
putchar('\n');
return 0;
}
Компиляция это, затем сделайте
cat file | ./a.out
Для получения списка уникальных печатаемых символов в file
.
Используйте set
структура данных. Большинство языков программирования / стандартные библиотеки идет с одним ароматом или другим. Если они не делают, используйте хеш-таблицу (или обычно, словарь) реализация и просто опустите поле значения. Используйте свои символы в качестве ключей. Эти структуры данных обычно отфильтровывают дублирующиеся записи (отсюда имя set
, от его математического использования: наборы не имеют особого порядка и только уникальных значений).
Согласно просьбе, чистый сценарий оболочки "решение":
sed -e "s/./\0\n/g" inputfile | sort -u
Это не хорошо, это не быстро, и вывод точно как не указан, но это должно работать... главным образом.
еще для большей нелепости, я представляю версию, которая выводит вывод на одной строке:
sed -e "s/./\0\n/g" inputfile | sort -u | while read c; do echo -n "$c" ; done
Версия сценария оболочки Bash (никакой sed/awk):
while read -n 1 char; do echo "$char"; done < entry.txt | tr [A-Z] [a-z] | sort -u
ОБНОВЛЕНИЕ : Только для heck ее, так как я скучал и все еще думающий об этой проблеме, вот набор использования версии C++. Если бы время выполнения важно, это было бы моей рекомендуемой опцией, так как версия C++ занимает немного больше чем половину секунды для обработки файла с 450 000 + записи.
#include <iostream>
#include <set>
int main() {
std::set<char> seen_chars;
std::set<char>::const_iterator iter;
char ch;
/* ignore whitespace and case */
while ( std::cin.get(ch) ) {
if (! isspace(ch) ) {
seen_chars.insert(tolower(ch));
}
}
for( iter = seen_chars.begin(); iter != seen_chars.end(); ++iter ) {
std::cout << *iter << std::endl;
}
return 0;
}
Примечание, что я игнорирую пробел и это нечувствительно к регистру согласно просьбе.
Для 450,000 + файл записи (chars.txt), вот демонстрационное время выполнения:
[user@host]$ g++ -o unique_chars unique_chars.cpp
[user@host]$ time ./unique_chars < chars.txt
a
b
d
o
y
real 0m0.638s
user 0m0.612s
sys 0m0.017s
В то время как не сценарий эта программа Java сделает работу. Легко понять быстрое (для выполнения)
import java.util.*;
import java.io.*;
public class Unique {
public static void main( String [] args ) throws IOException {
int c = 0;
Set s = new TreeSet();
while( ( c = System.in.read() ) > 0 ) {
s.add( Character.toLowerCase((char)c));
}
System.out.println( "Unique characters:" + s );
}
}
, Вы вызовете его как это:
type yourFile | java Unique
или
cat yourFile | java Unique
, Например, уникальные символы в HTML этого вопроса:
Unique characters:[ , , , , !, ", #, $, %, &, ', (, ), +, ,, -, ., /, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, :, ;, <, =, >, ?, @, [, \, ], ^, _, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, {, |, }]
import codecs
file = codecs.open('my_file_name', encoding='utf-8')
# Runtime: O(1)
letters = set()
# Runtime: O(n^2)
for line in file:
for character in line:
letters.add(character)
# Runtime: O(n)
letter_str = ''.join(letters)
print(letter_str)
Сохраняют как unique.py
и работают как python unique.py
.