Вы можете использовать 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;
}
}
}
Это может быть медленно для больших объемов данных, так как он использует массив ($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
на правильные имена. Это было самое простое решение, которое не изменяет порядок данных, хотя при необходимости возможны более быстрые.