разбить большую текстовую (xyz) базу данных на x равных частей - PullRequest
2 голосов
/ 08 марта 2012

Я хочу разбить большую текстовую базу данных (~ 10 миллионов строк). Я могу использовать команду как

$ sed -i -e '4 s/(dB)//' -e '4 s/Best\ unit/Best_Unit/' -e '1,3 d' '/cygdrive/c/                                                                                                                      Radio Mobile/Output/TRC_TestProcess/trc_longlands.txt'

$ split -l 1000000  /cygdrive/P/2012/Job_044_DM_Radio_Propogation/Working/FinalPropogation/TRC_Longlands/trc_longlands.txt 1

Первая строка - очистить базу данных, а следующая - разделить ее. но тогда выходные файлы не имеют имен полей. Как я могу включить имена полей в каждый набор данных и передать список, в котором есть исходный файл, новое имя файла и номера строк (из исходного файла). Это сделано для того, чтобы его можно было использовать в модели arcgis для повторного объединения окончательных упрощенных наборов данных многоугольника.

АЛЬТЕРНАТИВНО И БОЛЬШЕ ПОЛЕЗНО - так как это должно войти в модель arcgis, лучше всего решение на основе Python Больше подробностей в https://gis.stackexchange.com/questions/21420/large-point-to-polygon-by-buffer-join-buffer-dissolve-issues#comment29062_21420 и Удаление определенных строк из большого текстового файла в python

ТАК ИДЕТ С Python-решением на основе CYGWIN согласно ответу icyrock.com

у нас есть process_text.sh

cd  /cygdrive/P/2012/Job_044_DM_Radio_Propogation/Working/FinalPropogation/TRC_Longlands
mkdir processing
cp trc_longlands.txt processing/trc_longlands.txt
cd txt_processing
sed -i -e '4 s/(dB)//' -e '4 s/Best\ unit/Best_Unit/' -e '1,3 d' 'trc_longlands.txt'
split -l 1000000  trc_longlands.txt trc_longlands_
cat > a
h
1
2
3
4
5
6
7
8
9
^D
split -l 3
split -l 3 a 1
mv 1aa 21aa
for i in 1*; do head -n1 21aa|cat - $i > 2$i; done
for i in 21*; do echo ---- $i; cat $i; done

как можно заменить "TRC_Longlands" и путь на имя входного файла - в python у нас есть имя% path% /% для этого. в последней строке "do echo" необходимо?

и это вызывается python с использованием

import os
os.system("process_text.bat")

где process_text.bat в основном

bash process_text.sh

Я получаю следующую ошибку при запуске из DOS ...

Microsoft Windows [Версия 6.1.7601] Copyright (c) 2009 Microsoft Корпорация. Все права защищены.

C: \ Users \ georgec> Баш P: \ 2012 \ Job_044_DM_Radio_Propogation \ Working \ FinalPropogat ion \ TRC_Longlands \ process_text.sh 'bash' не распознается как внутренняя или внешняя команда, работающая программа или командный файл.

также когда я запускаю команду bash из cygwin, я получаю

georgec @ ATGIS25 / Cygdrive / P / 2012 / Job_044_DM_Radio_Propogation / Работа / FinalPropogation / TRC_Longlands $ bash process_text.sh: Нет такого файла или каталога: / Cygdrive / P / 2012 / Job_044_DM_Radio_Propogation / Работа / FinalPropogation / TRC_Longlands cp: не может создать обычный файл `processing / trc_longlands.txt \ r ': нет такой файл или каталог: Нет такого файла или каталога: txt_processing: Нет такого файла или directoryds.txt

но файлы создаются в корневом каталоге. enter image description here

почему есть "." после имени каталога? как им дать расширение .txt?

1 Ответ

1 голос
/ 08 марта 2012

Если вы хотите просто добавить первую строку исходного файла ко всем, кроме первого из разделений, вы можете сделать что-то вроде:

$ cat > a
h
1
2
3
4
5
6
7
^D
$ split -l 3
$ split -l 3 a 1
$ ls
1aa 1ab 1ac a
$ mv 1aa 21aa
$ for i in 1*; do head -n1 21aa|cat - $i > 2$i; done
$ for i in 21*; do echo ---- $i; cat $i; done
---- 21aa
h
1
2
---- 21ab
h
3
4
5
---- 21ac
h
6
7

Очевидно, что первый файл будет иметь на одну строку меньше, чем средние части, а последняя часть также может быть короче, но если это не проблема, это должно работать нормально. Конечно, если в вашем заголовке больше строк, просто измените head -n1 на head -nX, X - количество строк заголовка.

Надеюсь, это поможет.

...