@@ -40,6 +40,7 @@ def __init__(self, cell_value, cell_location):
40
40
except ImportError :
41
41
from UserDict import UserDict # pylint: disable=F0401
42
42
43
+
43
44
def convert_type (type_string , value , timezone = pytz .timezone ('UTC' )):
44
45
if value == '' or value is None :
45
46
return None
@@ -446,18 +447,29 @@ class CSVInput(SpreadsheetInput):
446
447
encoding = 'utf-8'
447
448
448
449
def get_sheet_headings (self , sheet_name ):
450
+ sheet_configuration = self .sheet_configuration [self .sheet_names_map [sheet_name ]]
451
+ configuration_line = 1 if sheet_configuration else 0
452
+ if not sheet_configuration :
453
+ sheet_configuration = self .base_configuration
454
+ if not self .use_configuration :
455
+ sheet_configuration = {}
456
+ skip_rows = sheet_configuration .get ("skipRows" , 0 )
457
+ if sheet_configuration .get ("ignore" ):
458
+ # returning empty headers is a proxy for no data in the sheet.
459
+ return []
460
+
449
461
if sys .version > '3' : # If Python 3 or greater
450
462
with open (os .path .join (self .input_name , sheet_name + '.csv' ), encoding = self .encoding ) as main_sheet_file :
451
463
r = csvreader (main_sheet_file )
452
- for row in enumerate (r ):
453
- # Just return the first row
454
- return row [ 1 ]
464
+ for num , row in enumerate (r ):
465
+ if num == ( skip_rows + configuration_line ):
466
+ return row
455
467
else : # If Python 2
456
468
with open (os .path .join (self .input_name , sheet_name + '.csv' )) as main_sheet_file :
457
469
r = csvreader (main_sheet_file , encoding = self .encoding )
458
- for row in enumerate (r ):
459
- # Just return the first row
460
- return row [ 1 ]
470
+ for num , row in enumerate (r ):
471
+ if num == ( skip_rows + configuration_line ):
472
+ return row
461
473
462
474
def read_sheets (self ):
463
475
sheet_file_names = os .listdir (self .input_name )
@@ -472,21 +484,66 @@ def read_sheets(self):
472
484
except ValueError :
473
485
pass
474
486
self .sub_sheet_names = sheet_names
487
+ self .sheet_names_map = OrderedDict ((sheet_name , sheet_name ) for sheet_name in sheet_names )
475
488
self .configure_sheets ()
476
489
490
+ def generate_rows (self , dictreader , sheet_name ):
491
+ sheet_configuration = self .sheet_configuration [self .sheet_names_map [sheet_name ]]
492
+ configuration_line = 1 if sheet_configuration else 0
493
+ if not sheet_configuration :
494
+ sheet_configuration = self .base_configuration
495
+ if not self .use_configuration :
496
+ sheet_configuration = {}
497
+
498
+ skip_rows = sheet_configuration .get ("skipRows" , 0 )
499
+ header_rows = sheet_configuration .get ("headerRows" , 1 )
500
+ for i in range (0 , configuration_line + skip_rows ):
501
+ previous_row = next (dictreader .reader )
502
+ if sys .version > '3' : # If Python 3 or greater
503
+ fieldnames = dictreader .fieldnames
504
+ else :
505
+ # unicodecsv dictreader always reads the headingline first
506
+ # so in the case of there being any rows to skip look at
507
+ # previous row and use that for fieldnames.
508
+ if (configuration_line + skip_rows ):
509
+ fieldnames = previous_row
510
+ dictreader .fieldnames = fieldnames
511
+ dictreader .unicode_fieldnames = fieldnames
512
+ else :
513
+ fieldnames = dictreader .unicode_fieldnames
514
+ for i in range (0 , header_rows - 1 ):
515
+ next (dictreader .reader )
516
+ for line in dictreader :
517
+ yield OrderedDict ((fieldname , line [fieldname ]) for fieldname in fieldnames )
518
+
519
+ def get_sheet_configuration (self , sheet_name ):
520
+ if sys .version > '3' : # If Python 3 or greater
521
+ with open (os .path .join (self .input_name , sheet_name + '.csv' ), encoding = self .encoding ) as main_sheet_file :
522
+ r = csvreader (main_sheet_file )
523
+ heading_row = next (r )
524
+ else : # If Python 2
525
+ with open (os .path .join (self .input_name , sheet_name + '.csv' )) as main_sheet_file :
526
+ r = csvreader (main_sheet_file , encoding = self .encoding )
527
+ heading_row = next (r )
528
+ if heading_row [0 ] == '#' :
529
+ return heading_row [1 :]
530
+ return []
531
+
532
+
533
+
477
534
def get_sheet_lines (self , sheet_name ):
478
535
if sys .version > '3' : # If Python 3 or greater
479
536
# Pass the encoding to the open function
480
537
with open (os .path .join (self .input_name , sheet_name + '.csv' ), encoding = self .encoding ) as main_sheet_file :
481
538
dictreader = DictReader (main_sheet_file )
482
- for line in dictreader :
483
- yield OrderedDict (( fieldname , line [ fieldname ]) for fieldname in dictreader . fieldnames )
539
+ for row in self . generate_rows ( dictreader , sheet_name ) :
540
+ yield row
484
541
else : # If Python 2
485
542
# Pass the encoding to DictReader
486
543
with open (os .path .join (self .input_name , sheet_name + '.csv' )) as main_sheet_file :
487
544
dictreader = DictReader (main_sheet_file , encoding = self .encoding )
488
- for line in dictreader :
489
- yield OrderedDict (( fieldname , line [ fieldname ]) for fieldname in dictreader . fieldnames )
545
+ for row in self . generate_rows ( dictreader , sheet_name ) :
546
+ yield row
490
547
491
548
492
549
class XLSXInput (SpreadsheetInput ):
0 commit comments