Nano Hash - криптовалюты, майнинг, программирование

эффективный способ проанализировать файл, чтобы вернуть список?

ID Name Department Salary Designation
---------------------------------------
1  Kent Engineering 100000$ senior-engineer  
2  Smith null       50,000$ administrator

Это записи большого файла, который у меня есть. Мне нужно проанализировать этот файл, чтобы получить зарплату и назначение. Ключ должен быть идентификатором, именем, отделом, и если это не удается, используйте идентификатор, имя. Для этого я могу использовать только Java/groovy... Как мне вернуть <Salary,Designation>...?

Каков наиболее эффективный способ grep, учитывая, что я могу использовать только java/groovy

04.11.2010

  • Мне любопытно, табуляция - это разделитель в этом файле или он более грязный? Было бы очень полезно узнать больше о формате, прежде чем предлагать потенциально ошибочное решение. 05.11.2010
  • @Pan - Я ответил на твой вопрос? Если да, то прими ответ 23.12.2010

Ответы:


1

Создайте BufferedReader, это позволит вам читать файл по одной строке за раз. Затем вызовите split("[\\\s]") для каждой из строк, это разделит их по пробелам.

Возможно, вам также придется помассировать поле зарплаты, чтобы его можно было преобразовать в число.

04.11.2010

2

Разделите каждую строку на пробел.

scala> val a = "1  Kent Engineering 100000$ senior-engineer"
a: java.lang.String = 1  Kent Engineering 100000$ senior-engineer

scala> a.split("\\s+")
res1: Array[java.lang.String] = Array(1, Kent, Engineering, 100000$, senior-engineer)

Затем возьмите необработанные строковые значения и проанализируйте их. Например. чтобы преобразовать 50 000 $ в число 50 000:

double salary = Double.parseDouble(array[SALARY_INDEX].replaceAll("[$,]",""))


java.lang.Double.parseDouble("50,000$".replaceAll("[$,]",""))
res6: Double = 50000.0
04.11.2010
  • И да, примеры — scala, но должно быть довольно ясно, как вместо этого использовать Java. Он работает совершенно так же, только немного отличается синтаксис для некоторых из них. 04.11.2010

  • 3

    Вы можете преобразовать файл в HashMap и хранить его столько, сколько вам нужно.

    У него высокая первоначальная стоимость, но если вы собираетесь его использовать часто, то это имеет смысл.

    Затем создайте свои объекты ключей и значений. Обязательно переопределите equals для вашего ключа.

    public class Key{
        int id;
        String name;
    
        @Override
        public boolean equals(Object o){...}
    }
    
    04.11.2010

    4

    Я предполагаю, что вы знаете, как читать файлы построчно, используя BufferedReader, так как это очевидное предварительное условие для такого рода вещей — если нет, кричите.

    Ключ — это то, что вы не указали. Каков точно формат данных, в частности, каковы точные правила определения того, где заканчивается одно поле и начинается другое?

    Если данные разделены символами табуляции (и указанные символы запрещены в данных, даже если они экранированы), то решение простое:

    // Ignoring general error handling and EOF-checking here
    final String line = bufferedReader.readLine();
    final String[] fields = line.split("\t");
    

    Теперь у вас есть массив, содержащий поля в строке, поэтому вы можете просто найти fields[3] и fields[4].

    Если разделителем является «любое количество пробелов», а пробелы полностью запрещены, то у вас такая же простая ситуация, когда ваше регулярное выражение line.split(" *").

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

    04.11.2010

    5

    С небольшим количеством библиотеки Guava решение становится простым и элегантным. Мы можем улучшить приведенный ниже код, объективизируя ключ, обрабатывая ошибки и т. д., но вы можете сделать это самостоятельно.

    import java.io.File;
    import java.io.IOException;
    import java.util.Iterator;
    import java.util.Map;
    
    import com.google.common.base.CharMatcher;
    import com.google.common.base.Charsets;
    import com.google.common.base.Joiner;
    import com.google.common.base.Splitter;
    import com.google.common.collect.Maps;
    import com.google.common.io.Files;
    import com.google.common.io.LineProcessor;
    
    public class FileProcessor
    {
    
        private static final Splitter SPLITTER = Splitter.on(CharMatcher.WHITESPACE);
    
        private static final Joiner KEY_BUILDER = Joiner.on("_").skipNulls();
    
        @SuppressWarnings("unchecked")
        public static void main(final String[] args) throws IOException
        {
            Map<String, SalaryAndDesignation> result = Files.readLines(new File("c:/1.txt"), Charsets.ISO_8859_1, new LineProcessor() {
    
                private final Map<String, SalaryAndDesignation> result = Maps.newHashMap();
    
                public Object getResult()
                {
                    return result;
                }
    
                public boolean processLine(final String line) throws IOException
                {
                    Iterator<String> columns = SPLITTER.split(line).iterator();
                    String id = columns.next();
                    String name = columns.next();
                    String dept = columns.next();
    
                    String key = KEY_BUILDER.join(id, name, "null".equals(dept) ? null : dept);
    
                    result.put(key, new SalaryAndDesignation(columns.next(), columns.next()));
                    return true;
                }
            });
            System.out.println(result.size());
        }
    
        final static class SalaryAndDesignation
        {
            String salary;
    
            String designation;
    
            public SalaryAndDesignation(final String salary, final String designation)
            {
                super();
                this.salary = salary;
                this.designation = designation;
            }
    
        }
    }
    

    Я вижу использование groovy результатов в меньшем коде, как пример ниже (скопировал/вставил отсюда), но сам никогда не пользовался

    new File("simple.tab").withReader{r->
        line = r.readLine();
        println "first line: $line"
        r.splitEachLine("\t"){fields->
                println "fields on line: $fields"
        }  
    }
    
    15.12.2010
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..