Найдите уникальные символы в файле

Вы можете использовать Pattern pattern = Pattern.compile( "[^<'tagname'/>]" );

16
задан Jay Bazuzi 23 December 2008 в 02:15
поделиться

21 ответ

Вот пример 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
4
ответ дан 30 November 2019 в 15:35
поделиться

Где 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 ГГц.

0
ответ дан 30 November 2019 в 15:35
поделиться

Этот ответ вышеупомянутое использование словаря.

Если так, код, представленный там, может быть оптимизирован немного, начиная с документация Python состояния:

Лучше думать о словаре как о незаказанном наборе ключа: пары значения, с требованием, чтобы ключи были уникальны (в рамках одного словаря).... При хранении использования ключа, который уже используется, о старом значении, связанном с тем ключом, забывают.

Поэтому эта строка кода может быть удалена, так как ключи словаря всегда будут уникальны так или иначе:

    if character not in letters:

И это должно сделать его немного быстрее.

0
ответ дан 30 November 2019 в 15:35
поделиться

Быстрое и грязное решение с помощью 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)

0
ответ дан 30 November 2019 в 15:35
поделиться

Хорошо мой друг, я думаю, что это - то, что Вы имели в виду.... По крайней мере, это - версия 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
0
ответ дан 30 November 2019 в 15:35
поделиться

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()) + "}"
0
ответ дан 30 November 2019 в 15:35
поделиться

Решение 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;
}
0
ответ дан 30 November 2019 в 15:35
поделиться

Попробуйте этот файл 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(''));
0
ответ дан 30 November 2019 в 15:35
поделиться

Python, не используя набор.

file = open('location', 'r')
letters = []
for line in file:
    for character in line:
        if character not in letters:
            letters.append(character)
0
ответ дан 30 November 2019 в 15:35
поделиться

Альтернативное решение с помощью удара:

sed "s/./\l\0\n/g" inputfile | sort -u | grep -vc ^$

РЕДАКТИРОВАНИЕ Извините, я на самом деле неправильно читал вопрос. Вышеупомянутый код количества уникальные символы. Просто исключение эти c переключатель в конце, очевидно, добивается цели, но затем, это решение не имеет никакого реального преимущества для saua's (тем более, что он теперь использует тот же sed шаблон вместо явных получений).

1
ответ дан 30 November 2019 в 15:35
поделиться

в C++ я сначала циклично выполнился бы через буквы в алфавите, затем выполняет strchr () на каждом с файлом как строка. это скажет Вам, если та буква будет существовать, то просто добавляют его к списку.

0
ответ дан 30 November 2019 в 15:35
поделиться
cat yourfile | 
 perl -e 'while(<>){chomp;$k{$_}++ for split(//, lc $_)}print keys %k,"\n";'
1
ответ дан 30 November 2019 в 15:35
поделиться

Алгоритм: Хлебают файл в память.

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.
2
ответ дан 30 November 2019 в 15:35
поделиться

Очень быстрое решение состояло бы в том, чтобы сделать маленькую программу 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)));
2
ответ дан 30 November 2019 в 15:35
поделиться

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
3
ответ дан 30 November 2019 в 15:35
поделиться

Быстрая и грязная программа 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.

5
ответ дан 30 November 2019 в 15:35
поделиться

Используйте set структура данных. Большинство языков программирования / стандартные библиотеки идет с одним ароматом или другим. Если они не делают, используйте хеш-таблицу (или обычно, словарь) реализация и просто опустите поле значения. Используйте свои символы в качестве ключей. Эти структуры данных обычно отфильтровывают дублирующиеся записи (отсюда имя set, от его математического использования: наборы не имеют особого порядка и только уникальных значений).

6
ответ дан 30 November 2019 в 15:35
поделиться

Согласно просьбе, чистый сценарий оболочки "решение":

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
10
ответ дан 30 November 2019 в 15:35
поделиться

Версия сценария оболочки 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
17
ответ дан 30 November 2019 в 15:35
поделиться

В то время как не сценарий эта программа 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, {, |, }]
1
ответ дан 30 November 2019 в 15:35
поделиться

Распечатайте уникальные символы (ASCII, и Unicode UTF-8)

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.

0
ответ дан 30 November 2019 в 15:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: