From e0b690363cf9365f1f927967114e5bc54f261ca1 Mon Sep 17 00:00:00 2001 From: "Alexandre Fayolle @ camptocamp" Date: Fri, 23 Nov 2012 15:59:10 +0100 Subject: [PATCH 1/2] [FIX] account_statement_base_import: allow to process CSV files written on MaxOS --- .../parser/file_parser.py | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/account_statement_base_import/parser/file_parser.py b/account_statement_base_import/parser/file_parser.py index 29115d46..74013299 100644 --- a/account_statement_base_import/parser/file_parser.py +++ b/account_statement_base_import/parser/file_parser.py @@ -19,8 +19,6 @@ ############################################################################## from openerp.tools.translate import _ -import base64 -import csv import tempfile import datetime from parser import BankStatementImportParser @@ -110,18 +108,14 @@ class FileParser(BankStatementImportParser): def _parse_csv(self, delimiter=';'): """ - :return: dict of dict from csv file (line/rows) + :return: list of dict from csv file (line/rows) """ csv_file = tempfile.NamedTemporaryFile() csv_file.write(self.filebuffer) - # We ensure that cursor is at beginig of file - csv_file.seek(0) - reader = UnicodeDictReader( - open(csv_file.name).readlines(), - delimiter=delimiter, - fieldnames=self.fieldnames - ) - return [x for x in reader] + csv_file.flush() + with open(csv_file.name, 'rU') as fobj: + reader = UnicodeDictReader(fobj, delimiter=delimiter, fieldnames=self.fieldnames) + return list(reader) def _parse_xls(self): """ From ccd7b763d105b5468b2c2f55734fdb4bacd4bc34 Mon Sep 17 00:00:00 2001 From: "Alexandre Fayolle @ camptocamp" Date: Fri, 23 Nov 2012 17:27:24 +0100 Subject: [PATCH 2/2] [FIX] account_statement_base_import: autodetect CSV file delimiter --- account_statement_base_import/parser/file_parser.py | 4 ++-- account_statement_base_import/parser/parser.py | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/account_statement_base_import/parser/file_parser.py b/account_statement_base_import/parser/file_parser.py index 74013299..e006e398 100644 --- a/account_statement_base_import/parser/file_parser.py +++ b/account_statement_base_import/parser/file_parser.py @@ -106,7 +106,7 @@ class FileParser(BankStatementImportParser): return True - def _parse_csv(self, delimiter=';'): + def _parse_csv(self): """ :return: list of dict from csv file (line/rows) """ @@ -114,7 +114,7 @@ class FileParser(BankStatementImportParser): csv_file.write(self.filebuffer) csv_file.flush() with open(csv_file.name, 'rU') as fobj: - reader = UnicodeDictReader(fobj, delimiter=delimiter, fieldnames=self.fieldnames) + reader = UnicodeDictReader(fobj, fieldnames=self.fieldnames) return list(reader) def _parse_xls(self): diff --git a/account_statement_base_import/parser/parser.py b/account_statement_base_import/parser/parser.py index c39098fa..a2dff32d 100644 --- a/account_statement_base_import/parser/parser.py +++ b/account_statement_base_import/parser/parser.py @@ -22,7 +22,12 @@ import base64 import csv def UnicodeDictReader(utf8_data, **kwargs): - csv_reader = csv.DictReader(utf8_data, **kwargs) + sniffer = csv.Sniffer() + pos = utf8_data.tell() + sample_data = utf8_data.read(1024) + utf8_data.seek(pos) + dialect = sniffer.sniff(sample_data, delimiters=',;\t') + csv_reader = csv.DictReader(utf8_data, dialect=dialect, **kwargs) for row in csv_reader: yield dict([(key, unicode(value, 'utf-8')) for key, value in row.iteritems()]) @@ -210,4 +215,4 @@ def new_bank_statement_parser(parser_name, *args, **kwargs): if cls.parser_for(parser_name): return cls(parser_name, *args, **kwargs) raise ValueError - \ No newline at end of file +