Ods2wiki.pl

From Organic Design wiki
Revision as of 04:46, 26 February 2009 by Nad (talk | contribs) (filter done)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
  1. !/usr/bin/perl
  2. Imports rows from an OpenOffice spreadsheet file (*.ods) into wiki record articlesOur Perl scripts.
  3. - processes only the first sheet
  4. - ignores empty rows

use strict; require('xml.pl');

  1. Column names and regex to determine rows imported (case insensitive)

my %filter = ( 'type' => 'hours' );

  1. Names of columns to include from source and their target names

my @mapcols = ( );

  1. Additional columns to add and a default value

my @addcols = ( );

  1. Extract the content.xml file from the .ods archive

my $xml = $ARGV[0] or die "Please specify a .ods file to import rows from";

  1. Convert the XML text to a hash tree (see http://www.organicdesign.co.nz/xml.pl)

$xml = xmlParse(join(, qx( unzip -p $xml content.xml )));

  1. Process the rows of the first sheet

my %cols = (); my $first = 1; for (@{$$xml{-content}}) { for (@{$$_{-content}}) { if ($$_{-name} eq 'office:body') { for (@{$$_{-content}}) { my $done = 0; for (@{$$_{-content}}) {

# Only process rows for the first sheet if ($$_{-name} eq 'table:table' && $done == 0) { $done++;

# Loop through the rows of this sheet for (@{$$_{-content}}) { my @row = (); for (@{$$_{-content}}) {

# Add this cell's content to the row my $cell = ; $cell = $$_{-content}[0] for @{$$_{-content}}; push @row, $cell;

# Handle the table:number-columns-repeated attribute if (defined $$_{'table:number-columns-repeated'} && $$_{'table:number-columns-repeated'} < 100) { push @row, $cell while --$$_{'table:number-columns-repeated'}; } }

# Process this row (unless empty) if (join(, @row)) {

# Process this data row (or define cols if first row) if ($first) { for (0..$#row) { $cols{lc $row[$_]} = $_ } $first = 0; } else {

# Check if it passes through the filter my $fail = 0; while (my ($col, $pat) = each(%filter)) { $fail = 1 unless $row[$cols{lc $col}] =~ /$pat/i; }

# Process this row if it passed unless ($fail) {

print join("\t", @row)."\n";

} } } } } } } } } }