Чтобы избежать возможных ошибок 'xargs: Argument list too long'
из-за использования find ... | xargs ...
при обработке десятков тысяч файлов, вы можете напрямую вывести вывод find
на tar
с помощью find ... -print0 | tar --null ...
.
# archive a given directory, but exclude various files & directories
# specified by their full file paths
find "$(pwd -P)" -type d \( -path '/path/to/dir1' -or -path '/path/to/dir2' \) -prune \
-or -not \( -path '/path/to/file1' -or -path '/path/to/file2' \) -print0 |
gnutar --null --no-recursion -czf archive.tar.gz --files-from -
#bsdtar --null -n -czf archive.tar.gz -T -
Динамический язык управляет для этого. Почему? Отображения легко кодировать и измениться. Вы не должны перекомпилировать и восстановить.
Действительно, с небольшим умом, у Вас может быть свой "XPath XML к Тегу-> отображения" поля таблицы DB как непересекающиеся блоки кода Python, который импортирует Ваше главное приложение.
Блок кода Python является Вашим конфигурационным файлом. Это не .ini
файл или a .properties
файл, который описывает конфигурацию. Это - конфигурация.
Мы используем Python, xml.etree и SQLAlchemy (для разделения SQL из программ) для этого, потому что мы в порядке с очень небольшим усилием и большой гибкостью.
source.py
"""A particular XML parser. Formats change, so sometimes this changes, too."""
import xml.etree.ElementTree as xml
class SSXML_Source( object ):
ns0= "urn:schemas-microsoft-com:office:spreadsheet"
ns1= "urn:schemas-microsoft-com:office:excel"
def __init__( self, aFileName, *sheets ):
"""Initialize a XML source.
XXX - Create better sheet filtering here, in the constructor.
@param aFileName: the file name.
"""
super( SSXML_Source, self ).__init__( aFileName )
self.log= logging.getLogger( "source.PCIX_XLS" )
self.dom= etree.parse( aFileName ).getroot()
def sheets( self ):
for wb in self.dom.getiterator("{%s}Workbook" % ( self.ns0, ) ):
for ws in wb.getiterator( "{%s}Worksheet" % ( self.ns0, ) ):
yield ws
def rows( self ):
for s in self.sheets():
print s.attrib["{%s}Name" % ( self.ns0, ) ]
for t in s.getiterator( "{%s}Table" % ( self.ns0, ) ):
for r in t.getiterator( "{%s}Row" % ( self.ns0, ) ):
# The XML may not be really useful.
# In some cases, you may have to convert to something useful
yield r
model.py
"""This is your target object.
It's part of the problem domain; it rarely changes.
"""
class MyTargetObject( object ):
def __init__( self ):
self.someAttr= ""
self.anotherAttr= ""
self.this= 0
self.that= 3.14159
def aMethod( self ):
"""etc."""
pass
builder_today.py Одна из многих отображающихся конфигураций
"""One of many builders. This changes all the time to fit
specific needs and situations. The goal is to keep this
short and to-the-point so that it has the mapping and nothing
but the mapping.
"""
import model
class MyTargetBuilder( object ):
def makeFromXML( self, element ):
result= model.MyTargetObject()
result.someAttr= element.findtext( "Some" )
result.anotherAttr= element.findtext( "Another" )
result.this= int( element.findtext( "This" ) )
result.that= float( element.findtext( "that" ) )
return result
loader.py
"""An application that maps from XML to the domain object
using a configurable "builder".
"""
import model
import source
import builder_1
import builder_2
import builder_today
# Configure this: pick a builder is appropriate for the data:
b= builder_today.MyTargetBuilder()
s= source.SSXML_Source( sys.argv[1] )
for r in s.rows():
data= b.makeFromXML( r )
# ... persist data with a DB save or file write
Для внесения изменений можно исправить разработчика или создать нового разработчика. Вы корректируете источник загрузчика для идентификации, какой разработчик будет использоваться. Без слишком большой проблемы, можно сделать выбор разработчика параметр командной строки. Динамический импорт на динамических языках походит на излишество мне, но они удобны.
Я предлагаю использовать шаблоны XSLT для преобразования XML в операторы INSERT (или независимо от того, что Вам нужно), как требуется.
Необходимо смочь вызвать XSLT с любого из языков, которые Вы упоминаете.
Это приведет к намного меньшему количеству кода, чем выполнение его длинный путь вокруг.
В.NET C# 3.0 и VB9 оказывают превосходную поддержку для работы с XML, использующим LINQ для XML:
Для быстрого благоприятного поворота я нашел Groovy очень полезным.
Я брошу в предложении для Hpricot, популярный Ruby синтаксический анализатор XML (хотя существует много подобных опций).
Пример:
Учитывая следующий XML:
<Export>
<Product>
<SKU>403276</SKU>
<ItemName>Trivet</ItemName>
<CollectionNo>0</CollectionNo>
<Pages>0</Pages>
</Product>
</Export>
Вы анализируете просто:
FIELDS = %w[SKU ItemName CollectionNo Pages]
doc = Hpricot.parse(File.read("my.xml"))
(doc/:product).each do |xml_product|
product = Product.new
for field in FIELDS
product[field] = (xml_product/field.intern).first.innerHTML
end
product.save
end
Это кажется, что Ваше приложение очень подходило бы для приложения направляющих, Вы могли быстро моделировать то, в чем Вы нуждаетесь, у Вас есть прямое взаимодействие с Вашей предпочтительной базой данных, и можно произвести данные однако, Вы должны.
Вот другая большая страница ресурса для парсинга XML с Hpricot, который мог бы помочь, а также документация.
или C# или VB.Net использование LiNQ к XML. LiNQ к XML очень очень мощен и легок реализовать
Интересным решением мог быть Ruby. Просто используйте XML-> Объектные картопостроители и затем используйте объектный реляционный картопостроитель (ORM) для помещения его в базе данных. Я должен был сделать короткий разговор о XML, Отображающемся с рубином, Вы могли посмотреть на слайды и видеть то, что Вы любите лучше всего: http://www.marc-seeger.de/2008/11/25/ruby-xml-mapping/
Что касается ORM: Active Record или Datamapper должны быть способом пойти
ECMAScript обрабатывает XML, довольно приятно использующий E4X ("ECMAScript для XML"). Это видно в последней версии Adobe ActionScript, версии 3. Я верю JavaScript 2 (чтобы быть выпущенным с Firefox 4, я думаю), будет поддерживать E4X также.
Не уверенный в поддержке автономных интерпретаторов JavaScript (т.е. Носорог, и др.) этого, которое является тем, что имеет значение больше всего для Вас, что я предполагаю... Но если это выглядит хорошим Вам, можно всегда искать их поддержку его (и сообщать нам :-)).
См. http://en.wikipedia.org/wiki/E4X#Example для простого примера.