Вы можете использовать PowerShell, который поставляется с Windows Vista или более поздней версии:
$keys = @( ); Import-Csv input.txt | ForEach-Object { if (!$_.head3) { $keys | Out-File output.txt; break; } else { if (!($keys -contains $_.head3)) { $keys += $_.head3; } } }
Это может быть медленно для больших объемов данных, так как он использует array ( $keys
) для хранения и проверки уникальных ключей. Альтернативный метод - записать все в текстовый файл, отсортировать и запустить его Get-Unique
. Другой альтернативой является использование хеш-таблицы (не поможет с использованием памяти, но будет быстрее, чем проверка, существует ли что-то в массиве).
Это использует Import-Csv
, который будет принимать первую строку в качестве заголовков. Затем он передает массив объектов (линий) в ForEach-Object
. $_
переменная, ссылающаяся на каждый объект (строку). .head3
это свойство с именем head3
, определенным в данных вашего примера как столбец, содержащий ключи. Он проверяет, есть ли значение для этого столбца в этой строке; если нет, то выводится в файл и завершается в соответствии с вашим псевдокодом. Обратите внимание, что неключевые значения могут быть приняты. Если у вас есть / нужны более строгие правила для того, что является ключом, вы можете проверить длину или выполнить какое-либо сопоставление с шаблоном RegEx и т. Д.
a71,a72,a73,a74 a71,a72,keyC,a74 some message a71,a72,keyD,a74
В настоящее время a73
считается ключом (он находится в третьем столбце head3
). Программа закончится в some message
, так как у нее нет третьего столбца, и она не будет прочитана keyD
.
Если в строке есть столбец ключа, он проверяет, существует ли ключ в массиве, и, если нет, добавляет его. Обратите внимание, что -contains
регистр не учитывается. Если это проблема, ее можно изменить.
Так что вам, вероятно, придется заменить input.txt
output.txt
и head3
правильными именами. Это было самое простое решение, которое не изменяет порядок данных, хотя при необходимости возможны более быстрые.