Проверьте, присутствует ли список шаблонов из file1.csv в file2.csv и измените записи в file2.csv

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

При использовании оператора == для сравнения строк вы не сравниваете содержимое строки , но фактически сравнивают адрес памяти. Если они равны, в противном случае они вернут true и false. Если значение равно в строке, сравнивает содержимое строки.

Итак, вопрос в том, что все строки кэшируются в системе, как получается == возвращает false, тогда как equals возвращает true? Ну, это возможно. Если вы создадите новую строку, например String str = new String("Testing"), вы создадите новую строку в кеше, даже если в кеше уже содержится строка с тем же содержимым. Короче говоря, "MyString" == new String("MyString") всегда будет возвращать false.

Java также говорит о функции intern (), которая может использоваться в строке, чтобы сделать ее частью кеша, поэтому "MyString" == new String("MyString").intern() вернет true.

Примечание: == оператор намного быстрее, чем равен только потому, что вы сравниваете два адреса памяти, но вы должны быть уверены, что код не создает новые экземпляры String в коде. В противном случае вы столкнетесь с ошибками.

0
задан Abhinay 17 January 2019 в 10:38
поделиться

2 ответа

Нет необходимости делать это так, просто awk читает два файла, это нормально:

awk -F, 'NR==FNR{a[$1]++;next;}a[$1]{$5="Y"}1' file1.csv file2.csv

Не уверены, что заголовок и вторая строка - это ваш способ объяснения, если вы хотите избавиться от них :

awk -F, 'NR==FNR{a[$1]++;next;}a[$1]{$5="Y"}FNR>2' file1.csv file2.csv

Обратите внимание, что если file1.csv может быть пустым, вы должны изменить NR==FNR на другие методы проверки файлов, такие как ARGIND==1 для GNU awk, или FILENAME=="file1.csv" и т. Д.

[1139 ] Если имеется огромное количество данных для работы, изменение a[$1]++ на a[$1]=1 немного улучшит скорость.
Также, если вы хотите сохранить заголовок (или 2-ю строку), то лучше начинать изменять массив a, когда FNR>1 или FNR>2. Усовершенствуйте команду самостоятельно, я уверен, что вы поняли;)

NR==FNR означает первый файл, потому что NR означает N число от R записей теперь FNR означает текущий F иле N номер R экордов.
a - это массив для сохранения $1 в качестве ключей.
next пропустить выполнение другого блока.

Когда NR==FNR равно false, это означает, что это не первый файл, первый блок не будет выполнен.
(Вы также можете использовать NR>FNR перед блоком, чтобы указать его, но так как я использовал next в блоке NR==FNR, так что в этом нет необходимости.)
Затем запускаются другие директивы, a[$1] заключается в том, чтобы судить, существует ли ключ в массиве a или нет (если обратиться к значению, буквально проверьте, что key exists фактически должно быть $1 in a), если он существует, то измените $ 5.
Последний 1 должен указывать истинное значение, это сокращение для {print}.
(Поскольку выражение без блока подразумевает {print}, и блок выполняется, когда вышеприведенное выражение рассчитывается как true, для которого 1 всегда верно.)

0
ответ дан Tiw 17 January 2019 в 10:38
поделиться

Вы можете попробовать решение Perl

$ perl -F, -lane 'BEGIN {%kv=map{chomp;

Вы можете попробовать решение Perl

[110].=>1} qx(cat file1.csv) } print "

Вы можете попробовать решение Perl

[110].", $kv{$F[0]}? "Y" : "" ' file2.csv aaa,2,3,4,Y aaa,2,3,4,Y bbb,2,3,4, ccc,2,3,4, ccc,2,3,4, ddd,2,3,4,Y ddd,2,3,4,Y ddd,2,3,4,Y eee,2,3,4, fff,2,3,4,Y ggg,2,3,4,Y hhh,2,3,4, hhh,2,3,4, $ cat file1.csv aaa ddd fff ggg $ cat file2.csv aaa,2,3,4, aaa,2,3,4, bbb,2,3,4, ccc,2,3,4, ccc,2,3,4, ddd,2,3,4, ddd,2,3,4, ddd,2,3,4, eee,2,3,4, fff,2,3,4, ggg,2,3,4, hhh,2,3,4, hhh,2,3,4, $
.
0
ответ дан stack0114106 17 January 2019 в 10:38
поделиться
Другие вопросы по тегам:

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