У меня очень большие двоичные файлы без строки и без полевых разделителей. Цель состоит в том, чтобы эффективно обрабатывать эти файлы в файлах с разделителями табуляции.Чтение, обработка непрерывного двоичного файла - Эффективно
файлы структурированы следующим образом:
Каждая запись имеет фиксированную длину, 20 байт. Каждое поле имеет разную длину, три поля длиной 3, 7 и 10 байт соответственно. Каждое поле также представляет другой тип данных, поля 1 и 2 - это int и 3 - char.
Что было бы самым эффективным способом обработки этих файлов? Я хотел бы сохранить его максимально простым, используя инструменты Bash, dd/od sed/awk, избегая perl/python, если это возможно, если разница в производительности не является экстремальной.
Ниже приведена рабочая попытка, это очень медленно. Я новичок в вышеупомянутых инструментах, поэтому подробные объяснения очень ценятся.
binfile="binfile.BIN"
for ((i = 0 ; i <= 20000000 ; i += 20))
do
field1=$(od "${binfile}" -An --skip-bytes"$((${i}))" --read-bytes=3 --format=dI)
field2=$(od "${binfile}" -An --skip-bytes"$((${i}+3))" --read-bytes=7 --format=dI)
field3=$(od "${binfile}" -An --skip-bytes"$((${i}+10))" --read-bytes=10 --format=c)
echo - ${field1}'\t'${field2}'\t'${field3} >> output.tab
done
и у вас нет/не разрешается писать 5 линии С-программу? Это было бы очень просто и очень-очень быстро. Удачи. – shellter
Я не знаю о C, который требует кучу шаблона, прежде чем вы сможете даже открыть файл, но в значительной степени ничего, кроме оболочки, было бы замечательно. – Borodin
Когда вы говорите двоично, вы имеете в виду, что первые 3 байта и следующие 7 байты представляют фактические целочисленные данные в их представлении на уровне машины, а не в ascii их версиях? И 3, и 7 - необычные длины для целочисленных данных (вместо этого ожидалось бы 4 и 8), поэтому должно быть некоторое дополнение. Кроме того, речь идет о достоверности данных. Есть ли вероятность, что вы можете опубликовать короткий шестнадцатеричный дамп некоторых выборочных данных и соответствующего вывода? – mhawke