├── tests ├── __init__.py ├── files │ ├── csv │ │ ├── without_header │ │ │ ├── SalesJan2009_without_header_empty_file.csv │ │ │ ├── DB_3388SF220401.txt │ │ │ ├── DB_33881RFQ220427.TXT │ │ │ ├── DB_33881SF220427.TXT │ │ │ ├── DB_3388GEPF220405.txt │ │ │ ├── DB_3388RFQ220418.txt │ │ │ └── SalesJan2009_without_header_incorrect_file.csv │ │ └── with_header │ │ │ ├── SalesJan2009_with_header_empty_file.csv │ │ │ └── SalesJan2009_with_header_correct_file_sample.csv │ └── configs │ │ ├── config_without_header.json │ │ ├── config_covid.json │ │ ├── config_with_header.json │ │ ├── new_config.json │ │ ├── config_layout_RFQ.json │ │ ├── config_layout_GE.json │ │ └── config_layout_SF.json ├── test_unit.py └── test_functional.py ├── csv_file_validator ├── __init__.py ├── settings.conf ├── exceptions.py ├── settings_parser.py ├── argument_parser.py ├── config.py ├── validation.py ├── file.py ├── __main__.py └── validation_functions.py ├── requirements.txt ├── docs └── img │ └── my_new_validation_function_interface_diagram.png ├── setup.py ├── LICENSE ├── .run └── Debug.run.xml ├── .gitignore └── README.md /tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /csv_file_validator/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | python-dateutil==2.7.5 2 | pytest 3 | -------------------------------------------------------------------------------- /tests/files/csv/without_header/SalesJan2009_without_header_empty_file.csv: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/files/csv/without_header/DB_3388SF220401.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/csv_file_validator/master/tests/files/csv/without_header/DB_3388SF220401.txt -------------------------------------------------------------------------------- /tests/files/csv/without_header/DB_33881RFQ220427.TXT: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/csv_file_validator/master/tests/files/csv/without_header/DB_33881RFQ220427.TXT -------------------------------------------------------------------------------- /tests/files/csv/without_header/DB_33881SF220427.TXT: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/csv_file_validator/master/tests/files/csv/without_header/DB_33881SF220427.TXT -------------------------------------------------------------------------------- /tests/files/csv/without_header/DB_3388GEPF220405.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/csv_file_validator/master/tests/files/csv/without_header/DB_3388GEPF220405.txt -------------------------------------------------------------------------------- /tests/files/csv/without_header/DB_3388RFQ220418.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/csv_file_validator/master/tests/files/csv/without_header/DB_3388RFQ220418.txt -------------------------------------------------------------------------------- /csv_file_validator/settings.conf: -------------------------------------------------------------------------------- 1 | [project_scoped_settings] 2 | RAISE_EXCEPTION_AND_HALT_ON_FAILED_VALIDATION = False 3 | SKIP_COLUMN_VALIDATIONS_ON_EMPTY_FILE = True 4 | -------------------------------------------------------------------------------- /docs/img/my_new_validation_function_interface_diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/csv_file_validator/master/docs/img/my_new_validation_function_interface_diagram.png -------------------------------------------------------------------------------- /tests/files/csv/with_header/SalesJan2009_with_header_empty_file.csv: -------------------------------------------------------------------------------- 1 | Transaction_date,Product,Price,Payment_Type,Name,City,State,Country,Account_Created,Last_Login,Latitude,Longitude 2 | -------------------------------------------------------------------------------- /tests/files/csv/with_header/SalesJan2009_with_header_correct_file_sample.csv: -------------------------------------------------------------------------------- 1 | Transaction_date,Product,Price,Payment_Type,Name,City,State,Country,Account_Created,Last_Login,Latitude,Longitude 2 | 1/2/09 6:17,Product1,1200,Mastercard,carolina,Basildon,England,United Kingdom,1/2/09 6:00,1/2/09 6:08,51.5,-1.1166667 3 | 1/2/09 4:53,Product1,1200,Visa,Betina,Parkville ,MO,United States,1/2/09 4:42,1/2/09 7:49,39.195,-94.68194 4 | 1/2/09 13:08,Product1,1200,Mastercard,Federica e Andrea,Astoria ,OR,United States,1/1/09 16:21,1/3/09 12:32,46.18806,-123.83 5 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | import setuptools 2 | 3 | with open("README.md", "r") as fh: 4 | long_description = fh.read() 5 | 6 | setuptools.setup( 7 | name="csv_file_validator", 8 | version="0.0.1", 9 | author="datahappy1", 10 | author_email="", 11 | description="csv file validation framework", 12 | long_description=long_description, 13 | long_description_content_type="text/markdown", 14 | url="https://github.com/datahappy1/csv_file_validator", 15 | packages=setuptools.find_packages(), 16 | include_package_data=True, 17 | classifiers=[ 18 | "Programming Language :: Python :: 3", 19 | "License :: OSI Approved :: MIT License", 20 | "Operating System :: OS Independent", 21 | ], 22 | ) 23 | -------------------------------------------------------------------------------- /tests/files/configs/config_without_header.json: -------------------------------------------------------------------------------- 1 | { 2 | "file_metadata": { 3 | "value_separator": ",", 4 | "row_terminator": "\n", 5 | "value_quote_char": "\"", 6 | "file_has_header": false 7 | }, 8 | "file_validation_rules": { 9 | "file_name_file_mask": "SalesJ", 10 | "file_extension": "csv", 11 | "file_size_range": [ 12 | 0, 13 | 1 14 | ], 15 | "file_row_count_range": [ 16 | 0, 17 | 1000 18 | ] 19 | }, 20 | "column_validation_rules": { 21 | "0": { 22 | "allow_data_type": "datetime.%M/%d/%y %H:%S" 23 | }, 24 | "1": { 25 | "allow_data_type": "str" 26 | }, 27 | "2": { 28 | "allow_int_value_range": [ 29 | 0, 30 | 100000 31 | ], 32 | "allow_data_type": "int" 33 | }, 34 | "10": { 35 | "allow_float_value_range": [ 36 | -50.5, 37 | 155.5 38 | ] 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /csv_file_validator/exceptions.py: -------------------------------------------------------------------------------- 1 | """ 2 | exceptions module 3 | """ 4 | 5 | 6 | class InvalidSettingsException(Exception): 7 | """ 8 | Invalid settings Exception custom exception type 9 | """ 10 | 11 | 12 | class InvalidFileLocationException(Exception): 13 | """ 14 | Invalid file location Exception custom exception type 15 | """ 16 | 17 | 18 | class InvalidConfigException(Exception): 19 | """ 20 | Invalid configuration file Exception custom exception type 21 | """ 22 | 23 | 24 | class InvalidLineColumnCountException(Exception): 25 | """ 26 | Invalid Line Column Count Exception custom exception type 27 | """ 28 | 29 | 30 | class FoundValidationErrorException(Exception): 31 | """ 32 | Found validation error Exception custom exception type 33 | """ 34 | 35 | 36 | class FoundValidationErrorsException(Exception): 37 | """ 38 | Found validation errors Exception custom exception type 39 | """ 40 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 datahappy1 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /tests/files/configs/config_covid.json: -------------------------------------------------------------------------------- 1 | { 2 | "file_metadata": { 3 | "value_separator": ",", 4 | "row_terminator": "\n", 5 | "file_has_header": true, 6 | "value_quote_char": "\"" 7 | }, 8 | "file_validation_rules": { 9 | "file_name_file_mask": ".+\\d+", 10 | "file_extension": "csv", 11 | "file_header_column_names": ["SNo","ObservationDate","Province/State","Country/Region", 12 | "Last Update","Confirmed","Deaths","Recovered" 13 | ], 14 | "file_size_range": [ 15 | 0, 16 | 1 17 | ], 18 | "file_row_count_range": [ 19 | 0, 20 | 10000 21 | ] 22 | }, 23 | "column_validation_rules": { 24 | "SNo": { 25 | "allow_data_type": "int", 26 | "allow_float_value_range": [ 27 | 0, 28 | 10000 29 | ] 30 | }, 31 | "Country/Region": { 32 | "allow_data_type": "str", 33 | "allow_regex":"[a-zA-Z].+" 34 | }, 35 | "Confirmed": { 36 | "allow_float_value_range": [ 37 | 0.0, 38 | 100000.0 39 | ], 40 | "allow_data_type": "float" 41 | }, 42 | "ObservationDate": { 43 | "allow_data_type": "datetime.%m/%d/%Y" 44 | }, 45 | "Last Update": { 46 | "allow_data_type": "datetime.%Y-%m-%dT%H:%M:%S" 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /tests/files/configs/config_with_header.json: -------------------------------------------------------------------------------- 1 | { 2 | "file_metadata": { 3 | "value_separator": ",", 4 | "row_terminator": "\n", 5 | "value_quote_char": "\"", 6 | "file_has_header": false 7 | }, 8 | "file_validation_rules": { 9 | "file_name_file_mask": ".+\\d+", 10 | "file_extension": "csv", 11 | "file_header_column_names": [ 12 | "Transaction_date", 13 | "Product", 14 | "Price", 15 | "Payment_Type", 16 | "Name", 17 | "City", 18 | "State", 19 | "Country", 20 | "Account_Created", 21 | "Last_Login", 22 | "Latitude", 23 | "Longitude" 24 | ], 25 | "file_size_range": [ 26 | 0, 27 | 1 28 | ], 29 | "file_row_count_range": [ 30 | 0, 31 | 1000 32 | ] 33 | }, 34 | "column_validation_rules": { 35 | "Transaction_date": { 36 | "allow_data_type": "datetime.%M/%d/%y %H:%S" 37 | }, 38 | "Country": { 39 | "allow_data_type": "str", 40 | "allow_regex": "[a-zA-Z].+" 41 | }, 42 | "Price": { 43 | "allow_int_value_range": [ 44 | 100, 45 | 100000 46 | ], 47 | "allow_data_type": "int" 48 | }, 49 | "Latitude": { 50 | "allow_float_value_range": [ 51 | -42.5, 52 | 90.5 53 | ] 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /tests/files/configs/new_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "file_metadata": { 3 | "file_type": "csv_multi_row_layouts", 4 | "layouts_indicator_field": "TipoReg", 5 | "layouts_map": { 6 | "H": "Header", 7 | "A": "AENC", 8 | "O": "AENC", 9 | "N": "AENC", 10 | "C": "AENC", 11 | "T": "Trailer" }, 12 | "value_separator": "|", 13 | "row_terminator": "\n", 14 | "value_quote_char": "\"", 15 | "file_has_header": false 16 | }, 17 | 18 | "file_validation_rules": { 19 | "file_name_file_mask": ".+\\d+", 20 | "file_extension": "TXT", 21 | "file_size_range": [ 22 | 0, 23 | 1 24 | ], 25 | "file_row_count_range": [ 26 | 0, 27 | 1000 28 | ] 29 | }, 30 | 31 | "column_validation_rules": { 32 | "Header": { 33 | "column_names": [ 34 | "TipoReg", 35 | "CodFFC", 36 | "DataArquivo", 37 | "NumSequencial", 38 | "ValorTotal", 39 | "NumRegistros" 40 | ], 41 | "validation_rules": { 42 | 43 | } 44 | }, 45 | "AENC": { 46 | "column_names": [ 47 | "TipoReg", 48 | 49 | ], 50 | "validation_rules": { 51 | 52 | } 53 | }, 54 | "Trailer": { 55 | "column_names": [ 56 | "TipoReg", 57 | "NumTotalLinhas" 58 | ], 59 | "validation_rules": { 60 | 61 | } 62 | }, 63 | } 64 | } 65 | 66 | -------------------------------------------------------------------------------- /.run/Debug.run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /tests/files/configs/config_layout_RFQ.json: -------------------------------------------------------------------------------- 1 | { 2 | "file_metadata": { 3 | "value_separator": "|", 4 | "row_terminator": "\n", 5 | "value_quote_char": "\"", 6 | "file_has_header": false 7 | }, 8 | "file_validation_rules": { 9 | "file_name_file_mask": "DB_3388", 10 | "file_extension": "TXT", 11 | "file_size_range": [ 12 | 0, 13 | 5 14 | ], 15 | "file_row_count_range": [ 16 | 0, 17 | 10000 18 | ] 19 | }, 20 | 21 | "column_validation_rules": { 22 | "0": { 23 | "allow_data_type": "str", 24 | "allow_fixed_value_list": [ 25 | "A", "O", "C", "S", "E" 26 | ] 27 | }, 28 | 29 | "1": { 30 | "allow_data_type": "str" 31 | }, 32 | 33 | "2": { 34 | "allow_data_type": "str" 35 | }, 36 | 37 | "3": { 38 | "allow_data_type": "str", 39 | "allow_regex":"[0-9,]" 40 | }, 41 | 42 | "4": { 43 | "allow_data_type": "int", 44 | "allow_int_value_range":[3, 24] 45 | }, 46 | 47 | "5": { 48 | "allow_data_type": "str", 49 | "allow_regex":"[0-9,]" 50 | }, 51 | 52 | "6": { 53 | "allow_null_value" : true, 54 | "allow_data_type": "str", 55 | "allow_regex":"[0-9,]" 56 | }, 57 | 58 | "7": { 59 | "allow_null_value" : true, 60 | "allow_data_type": "str" 61 | }, 62 | 63 | "8": { 64 | "allow_data_type": "datetime.%d%M%Y" 65 | }, 66 | 67 | "9": { 68 | "allow_null_value" : true, 69 | "allow_data_type": "str" 70 | }, 71 | 72 | "10": { 73 | "allow_data_type": "str" 74 | }, 75 | 76 | "11": { 77 | "allow_data_type": "datetime.%d%M%Y" 78 | }, 79 | 80 | "12": { 81 | "allow_data_type": "str" 82 | }, 83 | 84 | "13": { 85 | "allow_null_value" : true, 86 | "allow_data_type": "str" 87 | }, 88 | 89 | "14": { 90 | "allow_null_value" : true, 91 | "allow_data_type": "str" 92 | }, 93 | 94 | "15": { 95 | "allow_data_type": "str", 96 | "allow_unique_value": "unique" 97 | } 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /csv_file_validator/settings_parser.py: -------------------------------------------------------------------------------- 1 | """ 2 | settings parser 3 | """ 4 | import sys 5 | from configparser import ConfigParser 6 | from dataclasses import dataclass 7 | 8 | from exceptions import InvalidSettingsException 9 | 10 | 11 | @dataclass 12 | class Settings: 13 | """ 14 | settings class 15 | """ 16 | 17 | skip_column_validations_on_empty_file: bool 18 | raise_exception_and_halt_on_failed_validation: bool 19 | 20 | 21 | def prepare_settings(settings_file_loc="settings.conf") -> Settings: 22 | """ 23 | function for parsing values from settings.conf 24 | :param settings_file_loc: 25 | :return: 26 | """ 27 | settings: dict = dict() 28 | 29 | parser: ConfigParser = ConfigParser() 30 | parser.read(sys.path[0]+'/'+settings_file_loc) 31 | 32 | if not parser.has_section("project_scoped_settings"): 33 | raise InvalidSettingsException( 34 | "missing project_scoped_settings section in settings.conf" 35 | ) 36 | 37 | if not parser.has_option( 38 | "project_scoped_settings", "SKIP_COLUMN_VALIDATIONS_ON_EMPTY_FILE" 39 | ): 40 | raise InvalidSettingsException( 41 | "missing SKIP_COLUMN_VALIDATIONS_ON_EMPTY_FILE option " 42 | "in the section project_scoped_settings in settings.conf" 43 | ) 44 | 45 | if not parser.has_option( 46 | "project_scoped_settings", "RAISE_EXCEPTION_AND_HALT_ON_FAILED_VALIDATION" 47 | ): 48 | raise InvalidSettingsException( 49 | "missing RAISE_EXCEPTION_AND_HALT_ON_FAILED_VALIDATION option " 50 | "in the section project_scoped_settings in settings.conf" 51 | ) 52 | 53 | for name, value in parser.items("project_scoped_settings"): 54 | if value in ("True", "true"): 55 | settings[name] = True 56 | elif value in ("False", "false"): 57 | settings[name] = False 58 | else: 59 | settings[name] = value 60 | 61 | if settings["skip_column_validations_on_empty_file"] not in (True, False): 62 | settings["skip_column_validations_on_empty_file"] = False 63 | 64 | if settings["raise_exception_and_halt_on_failed_validation"] not in (True, False): 65 | settings["raise_exception_and_halt_on_failed_validation"] = False 66 | 67 | return Settings(**settings) 68 | -------------------------------------------------------------------------------- /csv_file_validator/argument_parser.py: -------------------------------------------------------------------------------- 1 | """ 2 | argument parser 3 | """ 4 | import json 5 | import os 6 | from argparse import ArgumentParser 7 | 8 | from exceptions import ( 9 | InvalidFileLocationException, 10 | InvalidConfigException, 11 | ) 12 | 13 | 14 | def prepare_args() -> dict: 15 | """ 16 | function for preparation of the CLI arguments 17 | :return: 18 | """ 19 | args = dict() 20 | 21 | parser = ArgumentParser() 22 | parser.add_argument("-fl", "--filelocation", type=str, required=True) 23 | parser.add_argument("-cfg", "--configfile", type=str, required=True) 24 | parsed = parser.parse_args() 25 | 26 | parsed_file_loc = parsed.filelocation 27 | parsed_file_loc_list = [] 28 | 29 | if os.path.isdir(parsed_file_loc): 30 | for path in os.listdir(parsed_file_loc): 31 | full_path = os.path.join(parsed_file_loc, path) 32 | if os.path.isfile(full_path): 33 | parsed_file_loc_list.append(full_path) 34 | if not parsed_file_loc_list: 35 | raise InvalidFileLocationException(f"Folder {parsed_file_loc} is empty") 36 | 37 | elif os.path.isfile(parsed_file_loc): 38 | parsed_file_loc_list = [parsed_file_loc] 39 | else: 40 | raise InvalidFileLocationException( 41 | f"Could not load file(s) {parsed_file_loc} " f"for validation" 42 | ) 43 | args["file_loc"] = parsed_file_loc_list 44 | 45 | parsed_config = parsed.configfile 46 | parsed_config_dict = None 47 | 48 | if os.path.isfile(parsed_config): 49 | with open(parsed_config, mode="r") as json_file: 50 | try: 51 | parsed_config_dict = json.load(json_file) 52 | except json.JSONDecodeError as json_decode_err: 53 | raise InvalidConfigException( 54 | f"Could not load config - valid file, " 55 | f"JSON decode error: {json_decode_err}" 56 | ) 57 | except Exception as exc: 58 | raise InvalidConfigException( 59 | f"Could not load config - valid file, " f"general exception: {exc}" 60 | ) 61 | else: 62 | raise InvalidConfigException("Could not load config file - not a valid file") 63 | 64 | args["config"] = parsed_config_dict 65 | 66 | return args 67 | -------------------------------------------------------------------------------- /tests/files/configs/config_layout_GE.json: -------------------------------------------------------------------------------- 1 | { 2 | "file_metadata": { 3 | "value_separator": "|", 4 | "row_terminator": "\n", 5 | "value_quote_char": "\"", 6 | "file_has_header": false 7 | }, 8 | "file_validation_rules": { 9 | "file_name_file_mask": "DB_3388", 10 | "file_extension": "TXT", 11 | "file_size_range": [ 12 | 0, 13 | 5 14 | ], 15 | "file_row_count_range": [ 16 | 0, 17 | 10000 18 | ] 19 | }, 20 | 21 | "column_validation_rules": { 22 | "0": { 23 | "allow_data_type": "str", 24 | "allow_fixed_value_list": [ 25 | "A", "O", "C" 26 | ] 27 | }, 28 | 29 | "1": { 30 | "allow_data_type": "str" 31 | }, 32 | 33 | "2": { 34 | "allow_data_type": "str" 35 | }, 36 | 37 | "3": { 38 | "allow_data_type": "str", 39 | "allow_regex":"[0-9,]" 40 | }, 41 | 42 | "4": { 43 | "allow_data_type": "int", 44 | "allow_int_value_range":[3, 24] 45 | }, 46 | 47 | "5": { 48 | "allow_null_value": true, 49 | "allow_data_type": "int", 50 | "allow_int_value_range":[12, 36] 51 | }, 52 | 53 | "6": { 54 | "allow_null_value" : true, 55 | "allow_data_type": "str", 56 | "allow_regex":"[0-9,]" 57 | }, 58 | 59 | "7": { 60 | "allow_null_value" : true, 61 | "allow_data_type": "str" 62 | }, 63 | 64 | "8": { 65 | "allow_null_value" : true, 66 | "allow_data_type": "str" 67 | }, 68 | 69 | "9": { 70 | "allow_data_type": "datetime.%d%M%Y" 71 | }, 72 | 73 | "10": { 74 | "allow_null_value" : true, 75 | "allow_data_type": "str", 76 | "allow_regex":"[0-9,]" 77 | }, 78 | 79 | "11": { 80 | "allow_null_value" : true, 81 | "allow_data_type": "str" 82 | }, 83 | 84 | "12": { 85 | "allow_null_value" : true, 86 | "allow_data_type": "datetime.%d%M%Y" 87 | }, 88 | 89 | "13": { 90 | "allow_null_value" : true, 91 | "allow_data_type": "str" 92 | }, 93 | 94 | "14": { 95 | "allow_null_value" : true, 96 | "allow_data_type": "str" 97 | }, 98 | 99 | "15": { 100 | "allow_data_type": "str", 101 | "allow_unique_value": "unique" 102 | } 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | 131 | .idea/ 132 | -------------------------------------------------------------------------------- /csv_file_validator/config.py: -------------------------------------------------------------------------------- 1 | """ 2 | config.py 3 | """ 4 | from dataclasses import dataclass 5 | 6 | from exceptions import InvalidConfigException 7 | 8 | 9 | @dataclass 10 | class FileMetadata: 11 | """ 12 | file metadata class 13 | """ 14 | value_separator: str 15 | value_quote_char: str 16 | row_terminator: str 17 | file_has_header: bool 18 | 19 | 20 | class Config: 21 | """ 22 | config class 23 | """ 24 | 25 | def __init__(self, file_metadata, file_validation_rules, column_validation_rules): 26 | self.file_metadata: FileMetadata = FileMetadata(**file_metadata) 27 | self.file_validation_rules: dict = file_validation_rules 28 | self.column_validation_rules: dict = column_validation_rules 29 | self._check_data_types() 30 | 31 | def _check_data_types(self): 32 | if any( 33 | x is not str 34 | for x in [ 35 | type(self.file_metadata.value_separator), 36 | type(self.file_metadata.value_quote_char), 37 | type(self.file_metadata.row_terminator), 38 | ] 39 | ): 40 | raise ValueError 41 | 42 | if type(self.file_metadata.file_has_header) is not bool: 43 | raise ValueError 44 | 45 | if any( 46 | x is not dict 47 | for x in [ 48 | type(self.column_validation_rules), 49 | type(self.file_validation_rules), 50 | ] 51 | ): 52 | raise ValueError 53 | 54 | 55 | def get_validated_config(config: dict) -> Config: 56 | """ 57 | get validated config function 58 | :param config: 59 | :return: 60 | """ 61 | if not config.get("file_metadata"): 62 | raise InvalidConfigException("config file missing metadata object") 63 | 64 | if not config.get("file_validation_rules") and not config.get( 65 | "column_validation_rules" 66 | ): 67 | raise InvalidConfigException( 68 | "config file missing file_validation_rules object and " 69 | "column_validation_rules object" 70 | ) 71 | 72 | config.setdefault("file_validation_rules", dict()) 73 | config.setdefault("column_validation_rules", dict()) 74 | 75 | try: 76 | return Config(**config) 77 | except (ValueError, TypeError) as config_err: 78 | raise InvalidConfigException(config_err) 79 | 80 | 81 | _ALLOWED_FILE_TYPES: list = [ 82 | "csv_single_row_layout", 83 | "csv_multi_row_layouts" 84 | ] 85 | -------------------------------------------------------------------------------- /tests/files/configs/config_layout_SF.json: -------------------------------------------------------------------------------- 1 | { 2 | "file_metadata": { 3 | "value_separator": "|", 4 | "row_terminator": "\n", 5 | "value_quote_char": "\"", 6 | "file_has_header": false 7 | }, 8 | "file_validation_rules": { 9 | "file_name_file_mask": "DB_3388", 10 | "file_extension": "TXT", 11 | "file_size_range": [ 12 | 0, 13 | 5 14 | ], 15 | "file_row_count_range": [ 16 | 0, 17 | 10000 18 | ] 19 | }, 20 | 21 | "column_validation_rules": { 22 | "0": { 23 | "allow_data_type": "str", 24 | "allow_fixed_value_list": [ 25 | "A", "O", "C", "P" 26 | ] 27 | }, 28 | 29 | "1": { 30 | "allow_data_type": "str", 31 | "allow_fixed_value_list": [ 32 | "PF", "PN", "PR", "AP", "AF", "SR", "DH", "SM", "AV" 33 | }, 34 | 35 | "2": { 36 | "allow_data_type": "str" 37 | }, 38 | 39 | "3": { 40 | "allow_data_type": "str", 41 | "allow_fixed_value_list": [ 42 | "EP", "CD", "CC", "CN", "AC", "CT", "AV", "VP" 43 | }, 44 | 45 | "4": { 46 | "allow_data_type": "str", 47 | "allow_fixed_value_list": [ 48 | "B", "C", "F" 49 | }, 50 | 51 | "5": { 52 | "allow_data_type": "datetime.%d%M%Y" 53 | }, 54 | 55 | "6": { 56 | "allow_data_type": "str" 57 | }, 58 | 59 | "7": { 60 | "allow_data_type": "str", 61 | "allow_regex":"[0-9,]" 62 | }, 63 | 64 | "8": { 65 | "allow_data_type": "str", 66 | "allow_regex":"[0-9,]" 67 | }, 68 | 69 | "9": { 70 | "allow_data_type": "str" 71 | }, 72 | 73 | "10": { 74 | "allow_data_type": "str" 75 | }, 76 | 77 | "11": { 78 | "allow_null_value" : true, 79 | "allow_data_type": "str" 80 | }, 81 | 82 | "12": { 83 | "allow_null_value" : true, 84 | "allow_data_type": "str" 85 | }, 86 | 87 | "13": { 88 | "allow_null_value" : true, 89 | "allow_data_type": "str" 90 | }, 91 | 92 | "14": { 93 | "allow_data_type": "datetime.%d%M%Y" 94 | }, 95 | 96 | "15": { 97 | "allow_data_type": "str", 98 | "allow_unique_value": "unique" 99 | }, 100 | "16": { 101 | "allow_data_type": "str", 102 | "allow_unique_value": "unique" 103 | } 104 | "17": { 105 | "allow_data_type": "str", 106 | "allow_unique_value": "unique" 107 | } 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /csv_file_validator/validation.py: -------------------------------------------------------------------------------- 1 | """ 2 | validation module 3 | """ 4 | 5 | from typing import List 6 | 7 | from config import Config 8 | from exceptions import InvalidConfigException 9 | from file import File 10 | from validation_functions import execute_mapped_validation_function 11 | from validation_functions import execute_mapped_defining_validation_function 12 | 13 | 14 | def validate_file(file_validations: dict, file: File) -> int: 15 | """ 16 | function for validating a file, for every file validation, call 17 | the mapped validation function and process it 18 | :return: 19 | """ 20 | file_validations_fail_count: int = 0 21 | 22 | for validation, validation_value in file_validations.items(): 23 | file_validations_fail_count += execute_mapped_validation_function( 24 | validation, 25 | **{ 26 | "file_name": file.file_name, 27 | "file_header": file.file_header, 28 | "file_row_count": file.file_data_row_count, 29 | "file_size": file.file_size, 30 | "validation_value": validation_value, 31 | }, 32 | ) 33 | 34 | return file_validations_fail_count 35 | 36 | 37 | def check_column_validation_rules_align_with_file_content( 38 | config: Config, file: File 39 | ) -> None: 40 | """ 41 | function checking column validation rules align with the file content 42 | :param config: 43 | :param file: 44 | :return: 45 | """ 46 | column_names_in_file: List[str] = [] 47 | column_indexes_in_file: List[str] = [] 48 | 49 | if file.file_header: 50 | column_names_in_file = file.file_header 51 | else: 52 | column_indexes_in_file = [ 53 | str(index) for index in range(0, file.get_first_row_column_count()) 54 | ] 55 | 56 | column_identifiers_in_file: List[ 57 | str 58 | ] = column_names_in_file + column_indexes_in_file 59 | 60 | column_validation_rules_names_in_config: List = list( 61 | config.column_validation_rules.keys() 62 | ) 63 | 64 | if not column_identifiers_in_file: 65 | raise InvalidConfigException( 66 | "Column validations set in the config, " 67 | "but none of the expected columns found in the file" 68 | ) 69 | 70 | if not all( 71 | item in column_identifiers_in_file 72 | for item in column_validation_rules_names_in_config 73 | ): 74 | raise InvalidConfigException( 75 | "Column validations set in the config, " 76 | "but not all expected columns found in the file" 77 | ) 78 | 79 | 80 | def validate_line_values(column_validations: dict, line: dict, idx: int) -> int: 81 | """ 82 | function for validating a line in a file, for every column validation, call 83 | the mapped validation function and process it 84 | :param column_validations: 85 | :param line: 86 | :param idx: 87 | :return: 88 | """ 89 | column_validations_fail_count: int = 0 90 | 91 | # looping through column names and column values in the line items 92 | for column_name, column_value in line.items(): 93 | if column_name in column_validations: 94 | # looping through validation items 95 | for validation, validation_value in column_validations[column_name].items(): 96 | ret_value = execute_mapped_defining_validation_function( 97 | validation, 98 | **{ 99 | "column": column_name, 100 | "validation_value": validation_value, 101 | "column_value": column_value, 102 | "row_number": idx, 103 | }, 104 | ) 105 | if ret_value == 2: 106 | column_validations_fail_count += execute_mapped_validation_function( 107 | validation, 108 | **{ 109 | "column": column_name, 110 | "validation_value": validation_value, 111 | "column_value": column_value, 112 | "row_number": idx, 113 | }, 114 | ) 115 | elif ret_value == 1: 116 | column_validations_fail_count += 1 117 | elif ret_value == 0: 118 | break 119 | 120 | return column_validations_fail_count 121 | -------------------------------------------------------------------------------- /csv_file_validator/file.py: -------------------------------------------------------------------------------- 1 | """ 2 | file.py 3 | """ 4 | import csv 5 | import os 6 | from collections.abc import Generator 7 | from dataclasses import dataclass 8 | from typing import List, Optional 9 | 10 | from config import Config 11 | from exceptions import InvalidLineColumnCountException 12 | 13 | 14 | @dataclass 15 | class CsvFileProperties: 16 | """ 17 | csv file format properties class 18 | """ 19 | 20 | file_row_terminator: str 21 | file_value_separator: str 22 | file_value_quote_char: str 23 | 24 | 25 | def construct_csv_file_properties(config: Config) -> CsvFileProperties: 26 | """ 27 | construct csv file properties 28 | :param config: 29 | :return: 30 | """ 31 | return CsvFileProperties( 32 | file_row_terminator=config.file_metadata.row_terminator, 33 | file_value_separator=config.file_metadata.value_separator, 34 | file_value_quote_char=config.file_metadata.value_quote_char, 35 | ) 36 | 37 | 38 | def get_csv_reader(file_handle, csv_file_properties: CsvFileProperties): 39 | """ 40 | get csv reader function 41 | :param file_handle: 42 | :param csv_file_properties: 43 | :return: 44 | """ 45 | return csv.reader( 46 | file_handle, 47 | delimiter=csv_file_properties.file_value_separator, 48 | quotechar=csv_file_properties.file_value_quote_char, 49 | ) 50 | 51 | 52 | class File: 53 | """ 54 | File class 55 | """ 56 | 57 | def __init__(self, config: Config, file_name: str): 58 | self.config: Config = config 59 | self.file_name: str = file_name 60 | self.csv_file_properties: CsvFileProperties = construct_csv_file_properties( 61 | self.config 62 | ) 63 | self.file_handle = open(file_name, mode="r", encoding="utf8") 64 | self.file_size: int = int(os.path.getsize(self.file_name) / 1024 / 1024) 65 | self.file_header: Optional[List[str]] = self._get_file_header() 66 | self.file_first_row_column_count: int = self.get_first_row_column_count() 67 | 68 | @property 69 | def file_with_configured_header_has_empty_header(self) -> bool: 70 | """ 71 | method checking if we can validate the file based on its content 72 | :return: 73 | """ 74 | return self.file_header == [""] 75 | 76 | @property 77 | def file_data_row_count(self) -> int: 78 | """ 79 | file data row count property 80 | :return: 81 | """ 82 | file_data_row_count: int = self._get_rowcount_from_generator() 83 | 84 | if self.file_header and self.file_header != [""]: 85 | # we subtract 1 from the file_row_count because of the header row 86 | file_data_row_count -= 1 87 | return file_data_row_count 88 | 89 | @property 90 | def file_has_no_data_rows(self) -> bool: 91 | """ 92 | method checking if the file has any rows (besides header row if configured) 93 | :return: 94 | """ 95 | return self.file_data_row_count == 0 96 | 97 | def _get_rowcount_from_generator(self) -> int: 98 | """ 99 | method to get count of rows from _file_rowcount_generator 100 | :return: 101 | """ 102 | 103 | def _file_rowcount_generator() -> Generator: 104 | """ 105 | file row counting generator method 106 | :return: 107 | """ 108 | for _ in get_csv_reader( 109 | file_handle=self.file_handle, 110 | csv_file_properties=self.csv_file_properties, 111 | ): 112 | yield 113 | 114 | row_count: int = len(list(_file_rowcount_generator())) 115 | 116 | self.reset_file_handler() 117 | 118 | return row_count 119 | 120 | def _get_file_header(self) -> list: 121 | """ 122 | method to get file header row 123 | :return: 124 | """ 125 | file_header: Optional[List[str]] = None 126 | if self.config.file_metadata.file_has_header: 127 | file_header = ( 128 | self.file_handle.readline() 129 | .rstrip(self.csv_file_properties.file_row_terminator) 130 | .split(self.csv_file_properties.file_value_separator) 131 | ) 132 | 133 | self.reset_file_handler() 134 | 135 | return file_header 136 | 137 | def get_first_row_column_count(self) -> int: 138 | """ 139 | method to get the first data row item length for file 140 | column count integrity check in the file_read_generator method 141 | :return: 142 | """ 143 | first_row: List = ( 144 | self.file_handle.readline() 145 | .rstrip(self.csv_file_properties.file_row_terminator) 146 | .split(self.csv_file_properties.file_value_separator) 147 | ) 148 | 149 | self.reset_file_handler() 150 | 151 | return len(first_row) if first_row != [""] else 0 152 | 153 | def reset_file_handler(self) -> None: 154 | """ 155 | method to reset the file handler using seek back to file beginning 156 | :return: 157 | """ 158 | self.file_handle.seek(0) 159 | 160 | def close_file_handler(self) -> None: 161 | """ 162 | method for closing the file handler after validations finished 163 | :return: 164 | """ 165 | self.file_handle.close() 166 | 167 | def file_read_generator(self) -> Generator: 168 | """ 169 | file reading generator method 170 | :return: 171 | """ 172 | row_count: int = 0 173 | for row in get_csv_reader( 174 | file_handle=self.file_handle, csv_file_properties=self.csv_file_properties 175 | ): 176 | row_count += 1 177 | 178 | if len(row) != self.file_first_row_column_count: 179 | raise InvalidLineColumnCountException( 180 | f"row #: {row_count}, " 181 | f"expected column count: " 182 | f"{self.get_first_row_column_count()}, " 183 | f"actual column count: " 184 | f"{len(row)}" 185 | ) 186 | 187 | if self.file_header and row_count > 1: 188 | # if file contains header, yield row number and column names with values as dict 189 | # row number,{'column name 1': 'value', 'column name 2': 'value',..} 190 | yield row_count, dict(zip(self.file_header, row)) 191 | elif not self.file_header: 192 | # if file is without header, yield row number and column indexes with values as dict 193 | # row number,{'0': 'value', '1': 'value',..} 194 | yield row_count, dict((str(x[0]), x[1]) for x in enumerate(row)) 195 | else: 196 | # file header row so continue, header should be checked separately in 197 | # file_validation_rules.file_header_column_names 198 | continue 199 | -------------------------------------------------------------------------------- /tests/test_unit.py: -------------------------------------------------------------------------------- 1 | from csv_file_validator import validation_functions 2 | 3 | 4 | class TestsFileLevelValidationFuncs: 5 | TESTING_KWARGS = {'file_name': 'SalesJan2009_with_header_fixed_sample.csv', 6 | 'file_row_count': 1000, 7 | 'file_size': 10, 8 | 'file_header': [ 9 | "Transaction_date", 10 | "Product", 11 | "Price" 12 | ]} 13 | 14 | def test_check_file_extension(self): 15 | TestsFileLevelValidationFuncs.TESTING_KWARGS['validation_value'] = 'csv' 16 | assert validation_functions.check_file_extension(**TestsFileLevelValidationFuncs.TESTING_KWARGS) == 0 17 | 18 | TestsFileLevelValidationFuncs.TESTING_KWARGS['validation_value'] = 'tsv' 19 | assert validation_functions.check_file_extension(**TestsFileLevelValidationFuncs.TESTING_KWARGS) == 1 20 | 21 | def test_check_file_mask(self): 22 | TestsFileLevelValidationFuncs.TESTING_KWARGS['validation_value'] = '.+\\d+' 23 | assert validation_functions.check_file_mask(**TestsFileLevelValidationFuncs.TESTING_KWARGS) == 0 24 | 25 | TestsFileLevelValidationFuncs.TESTING_KWARGS['validation_value'] = 'd+' 26 | assert validation_functions.check_file_mask(**TestsFileLevelValidationFuncs.TESTING_KWARGS) == 1 27 | 28 | def test_check_file_size_range(self): 29 | TestsFileLevelValidationFuncs.TESTING_KWARGS['validation_value'] = [0, 100] 30 | assert validation_functions.check_file_size_range(**TestsFileLevelValidationFuncs.TESTING_KWARGS) == 0 31 | 32 | TestsFileLevelValidationFuncs.TESTING_KWARGS['validation_value'] = [100, 150] 33 | assert validation_functions.check_file_size_range(**TestsFileLevelValidationFuncs.TESTING_KWARGS) == 1 34 | 35 | def test_check_file_row_count_range(self): 36 | TestsFileLevelValidationFuncs.TESTING_KWARGS['validation_value'] = [0, 10000] 37 | assert validation_functions.check_file_row_count_range( 38 | **TestsFileLevelValidationFuncs.TESTING_KWARGS) == 0 39 | 40 | TestsFileLevelValidationFuncs.TESTING_KWARGS['validation_value'] = [50, 100] 41 | assert validation_functions.check_file_row_count_range( 42 | **TestsFileLevelValidationFuncs.TESTING_KWARGS) == 1 43 | 44 | def test_check_file_header_column_names(self): 45 | TestsFileLevelValidationFuncs.TESTING_KWARGS['validation_value'] = ["Transaction_date", 46 | "Product", 47 | "Price"] 48 | assert validation_functions.check_file_header_column_names( 49 | **TestsFileLevelValidationFuncs.TESTING_KWARGS) == 0 50 | 51 | TestsFileLevelValidationFuncs.TESTING_KWARGS['validation_value'] = ["wrong_col_name1", 52 | "wrong_col_name2", 53 | "wrong_col_name3"] 54 | assert validation_functions.check_file_header_column_names( 55 | **TestsFileLevelValidationFuncs.TESTING_KWARGS) == 1 56 | 57 | 58 | class TestLineLevelValidationFuncs: 59 | TESTING_KWARGS_INT_COLUMN = {'column': 'Price', 60 | 'column_value': '1201'} 61 | TESTING_KWARGS_FLOAT_COLUMN = {'column': 'Price', 62 | 'column_value': '12.01'} 63 | TESTING_KWARGS_STR_COLUMN = {'column': 'Country', 64 | 'column_value': 'United States'} 65 | 66 | def test_check_column_allow_data_type(self): 67 | TestLineLevelValidationFuncs.TESTING_KWARGS_INT_COLUMN['validation_value'] = 'int' 68 | assert validation_functions.check_column_allow_data_type( 69 | **TestLineLevelValidationFuncs.TESTING_KWARGS_INT_COLUMN) == 0 70 | 71 | TestLineLevelValidationFuncs.TESTING_KWARGS_INT_COLUMN['validation_value'] = 'float' 72 | assert validation_functions.check_column_allow_data_type( 73 | **TestLineLevelValidationFuncs.TESTING_KWARGS_INT_COLUMN) == 1 74 | 75 | def test_check_column_allow_int_value_range(self): 76 | TestLineLevelValidationFuncs.TESTING_KWARGS_INT_COLUMN['validation_value'] = [0, 2000] 77 | assert validation_functions.check_column_allow_int_value_range( 78 | **TestLineLevelValidationFuncs.TESTING_KWARGS_INT_COLUMN) == 0 79 | 80 | TestLineLevelValidationFuncs.TESTING_KWARGS_INT_COLUMN['validation_value'] = [5000, 10000] 81 | assert validation_functions.check_column_allow_int_value_range( 82 | **TestLineLevelValidationFuncs.TESTING_KWARGS_INT_COLUMN) == 1 83 | 84 | def test_check_column_allow_float_value_range(self): 85 | TestLineLevelValidationFuncs.TESTING_KWARGS_FLOAT_COLUMN['validation_value'] = [0.10, 20.15] 86 | assert validation_functions.check_column_allow_float_value_range( 87 | **TestLineLevelValidationFuncs.TESTING_KWARGS_FLOAT_COLUMN) == 0 88 | 89 | TestLineLevelValidationFuncs.TESTING_KWARGS_FLOAT_COLUMN['validation_value'] = [-12.55, 10.20] 90 | assert validation_functions.check_column_allow_float_value_range( 91 | **TestLineLevelValidationFuncs.TESTING_KWARGS_FLOAT_COLUMN) == 1 92 | 93 | def test_check_column_allow_fixed_value_list(self): 94 | TestLineLevelValidationFuncs.TESTING_KWARGS_INT_COLUMN['validation_value'] = [1201, 1202] 95 | assert validation_functions.check_column_allow_fixed_value_list( 96 | **TestLineLevelValidationFuncs.TESTING_KWARGS_INT_COLUMN) == 0 97 | 98 | TestLineLevelValidationFuncs.TESTING_KWARGS_INT_COLUMN['validation_value'] = [3000, 3001] 99 | assert validation_functions.check_column_allow_fixed_value_list( 100 | **TestLineLevelValidationFuncs.TESTING_KWARGS_INT_COLUMN) == 1 101 | 102 | def test_check_column_allow_fixed_value(self): 103 | TestLineLevelValidationFuncs.TESTING_KWARGS_INT_COLUMN['validation_value'] = 1201 104 | assert validation_functions.check_column_allow_fixed_value( 105 | **TestLineLevelValidationFuncs.TESTING_KWARGS_INT_COLUMN) == 0 106 | 107 | TestLineLevelValidationFuncs.TESTING_KWARGS_INT_COLUMN['validation_value'] = 9999 108 | assert validation_functions.check_column_allow_fixed_value( 109 | **TestLineLevelValidationFuncs.TESTING_KWARGS_INT_COLUMN) == 1 110 | 111 | def test_check_column_allow_substring(self): 112 | TestLineLevelValidationFuncs.TESTING_KWARGS_STR_COLUMN['validation_value'] = 'xUnited Statesx' 113 | assert validation_functions.check_column_allow_substring( 114 | **TestLineLevelValidationFuncs.TESTING_KWARGS_STR_COLUMN) == 0 115 | 116 | TestLineLevelValidationFuncs.TESTING_KWARGS_STR_COLUMN['validation_value'] = 'xxyz' 117 | assert validation_functions.check_column_allow_substring( 118 | **TestLineLevelValidationFuncs.TESTING_KWARGS_STR_COLUMN) == 1 119 | 120 | def test_check_column_allow_regex(self): 121 | TestLineLevelValidationFuncs.TESTING_KWARGS_STR_COLUMN['validation_value'] = '[a-zA-Z].+' 122 | assert validation_functions.check_column_allow_regex( 123 | **TestLineLevelValidationFuncs.TESTING_KWARGS_STR_COLUMN) == 0 124 | 125 | TestLineLevelValidationFuncs.TESTING_KWARGS_STR_COLUMN['validation_value'] = '[A-D]' 126 | assert validation_functions.check_column_allow_regex( 127 | **TestLineLevelValidationFuncs.TESTING_KWARGS_STR_COLUMN) == 1 128 | -------------------------------------------------------------------------------- /csv_file_validator/__main__.py: -------------------------------------------------------------------------------- 1 | """ 2 | __main__.py 3 | """ 4 | import logging 5 | from enum import Enum 6 | from typing import List, Optional 7 | 8 | from argument_parser import prepare_args 9 | from config import get_validated_config, Config 10 | from exceptions import ( 11 | InvalidConfigException, 12 | InvalidLineColumnCountException, 13 | FoundValidationErrorException, 14 | FoundValidationErrorsException, 15 | InvalidSettingsException, 16 | InvalidFileLocationException, 17 | ) 18 | from file import File 19 | from settings_parser import prepare_settings, Settings 20 | from validation import ( 21 | validate_file, 22 | check_column_validation_rules_align_with_file_content, 23 | validate_line_values, 24 | ) 25 | 26 | LOGGING_LEVEL = logging.DEBUG 27 | 28 | logging.basicConfig(level=LOGGING_LEVEL) 29 | logger = logging.getLogger(__name__) 30 | 31 | 32 | class ValidationResultEnum(Enum): 33 | SUCCESS = 0 34 | FAILURE = 1 35 | COULD_NOT_PROCESS = 2 36 | 37 | 38 | class ValidationResultItem: 39 | def __init__(self, file_name: str, result: ValidationResultEnum): 40 | self.file_name: str = file_name 41 | self.result: ValidationResultEnum = result 42 | 43 | def __repr__(self): 44 | return f"{self.file_name} -> {self.result.name}" 45 | 46 | 47 | def process_file_validations(config: Config, settings: Settings, file: File) -> None: 48 | """ 49 | process file level validations function 50 | :param config: 51 | :param settings: 52 | :param file: 53 | :return: 54 | """ 55 | failed_file_validations_counter: int = 0 56 | 57 | file_validations: dict = config.file_validation_rules 58 | file_validations_count: int = (len(file_validations) if file_validations else 0) 59 | 60 | if file.file_with_configured_header_has_empty_header: 61 | raise InvalidConfigException( 62 | "File with header set to true in the config has no header row" 63 | ) 64 | 65 | logger.info("Found %s file validations", file_validations_count) 66 | 67 | if file_validations_count > 0: 68 | try: 69 | failed_file_validations_counter = validate_file(file_validations, file) 70 | if ( 71 | settings.raise_exception_and_halt_on_failed_validation 72 | and failed_file_validations_counter > 0 73 | ): 74 | raise FoundValidationErrorException( 75 | "Evaluation of a file validation rule failed" 76 | ) 77 | 78 | except InvalidConfigException as conf_err: 79 | logger.error( 80 | "File %s cannot be validated, config file has issues, %s", 81 | file.file_name, 82 | conf_err, 83 | ) 84 | raise conf_err 85 | 86 | if failed_file_validations_counter > 0: 87 | raise FoundValidationErrorsException( 88 | f"Evaluation of " 89 | f"{failed_file_validations_counter} " 90 | f"file validation rule(s) failed" 91 | ) 92 | 93 | 94 | def process_column_validations(config: Config, settings: Settings, file: File) -> None: 95 | """ 96 | process column level validations function 97 | :param config: 98 | :param settings: 99 | :param file: 100 | :return: 101 | """ 102 | if file.file_has_no_data_rows and settings.skip_column_validations_on_empty_file: 103 | logger.info("File has no rows to validate, skipping column level validations") 104 | return 105 | 106 | failed_column_validations_counter: int = 0 107 | 108 | check_column_validation_rules_align_with_file_content(config, file) 109 | 110 | column_validations: dict = config.column_validation_rules 111 | column_validations_count: int = ( 112 | len(column_validations) if column_validations else 0 113 | ) 114 | 115 | logger.info("Found %s column validations", column_validations_count) 116 | 117 | if column_validations_count > 0: 118 | try: 119 | for idx, line in file.file_read_generator(): 120 | validation_result: int = validate_line_values( 121 | column_validations, line, idx 122 | ) 123 | failed_column_validations_counter += validation_result 124 | if ( 125 | settings.raise_exception_and_halt_on_failed_validation 126 | and validation_result > 0 127 | ): 128 | raise FoundValidationErrorException( 129 | "Evaluation of a column validation rule failed" 130 | ) 131 | 132 | except InvalidConfigException as conf_err: 133 | logger.error( 134 | "File %s cannot be validated, config file has issues, %s", 135 | file.file_name, 136 | conf_err, 137 | ) 138 | raise conf_err 139 | except InvalidLineColumnCountException as col_count_err: 140 | logger.error( 141 | "File %s cannot be validated, column count is not consistent, %s", 142 | file.file_name, 143 | col_count_err, 144 | ) 145 | raise col_count_err 146 | 147 | if failed_column_validations_counter > 0: 148 | raise FoundValidationErrorsException( 149 | f"Evaluation of " 150 | f"{failed_column_validations_counter} " 151 | f"column validation rule(s) failed" 152 | ) 153 | 154 | 155 | def process_file( 156 | config: Config, settings: Settings, file_name: str 157 | ) -> ValidationResultEnum: 158 | """ 159 | process_file function 160 | :param config: 161 | :param settings: 162 | :param file_name: 163 | :return: 164 | """ 165 | try: 166 | file: File = File(config, file_name) 167 | logger.info("Validation of %s started", file_name) 168 | except Exception as exc: 169 | logger.error("File %s setup raised issues, %s", file_name, exc) 170 | return ValidationResultEnum.COULD_NOT_PROCESS 171 | 172 | accumulated_errors: str = str() 173 | 174 | try: 175 | process_file_validations(config=config, settings=settings, file=file) 176 | except (FoundValidationErrorException, InvalidConfigException) as halt_flow_exc: 177 | logger.info( 178 | "Failed to validate file %s , reason: %s", 179 | file_name, 180 | halt_flow_exc.__str__(), 181 | ) 182 | file.close_file_handler() 183 | return ValidationResultEnum.FAILURE 184 | except FoundValidationErrorsException as found_validation_errors_continue_flow_exc: 185 | accumulated_errors += str(found_validation_errors_continue_flow_exc) 186 | 187 | try: 188 | process_column_validations(config=config, settings=settings, file=file) 189 | except ( 190 | FoundValidationErrorException, 191 | InvalidConfigException, 192 | InvalidLineColumnCountException, 193 | ) as halt_flow_exc: 194 | logger.info( 195 | "Failed to validate file %s , reason: %s", 196 | file_name, 197 | halt_flow_exc.__str__(), 198 | ) 199 | file.close_file_handler() 200 | return ValidationResultEnum.FAILURE 201 | except FoundValidationErrorsException as found_validation_errors_continue_flow_exc: 202 | accumulated_errors += str(found_validation_errors_continue_flow_exc) 203 | 204 | file.close_file_handler() 205 | 206 | if accumulated_errors: 207 | logger.info( 208 | "Failed to validate file %s , reason: %s", file_name, accumulated_errors, 209 | ) 210 | return ValidationResultEnum.FAILURE 211 | 212 | logger.info("Validation of %s finished without any errors", file_name) 213 | return ValidationResultEnum.SUCCESS 214 | 215 | 216 | def main() -> Optional[List[ValidationResultItem]]: 217 | """ 218 | main function 219 | :return: 220 | """ 221 | try: 222 | prepared_args: dict = prepare_args() 223 | except (InvalidConfigException, InvalidFileLocationException) as invalid_args_exc: 224 | logger.error(invalid_args_exc) 225 | return None 226 | 227 | try: 228 | config: Config = get_validated_config(prepared_args["config"]) 229 | except InvalidConfigException as invalid_config_exc: 230 | logger.error(invalid_config_exc) 231 | return None 232 | 233 | try: 234 | settings: Settings = prepare_settings() 235 | except InvalidSettingsException as invalid_settings_exc: 236 | logger.error(invalid_settings_exc) 237 | return None 238 | 239 | validation_results: List[ValidationResultItem] = [] 240 | 241 | for file_name in prepared_args["file_loc"]: 242 | validation_result_item: ValidationResultItem = ValidationResultItem( 243 | file_name=file_name, 244 | result=process_file(config=config, settings=settings, file_name=file_name), 245 | ) 246 | 247 | validation_results.append(validation_result_item) 248 | 249 | return validation_results 250 | 251 | 252 | if __name__ == "__main__": 253 | main() 254 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # csv_file_validator 2 | ## Python CSV file validation tool 3 | 4 | This tool is written with type hints introduced in Python 3.5 5 | 6 | - [What this tool can do](#what-this-tool-can-do) 7 | - [Validation schema](#validation-schema) 8 | - [Validation schema for a file with a header](#validation-schema-for-a-file-with-a-header) 9 | - [Validation schema for a file without a header](#validation-schema-for-a-file-without-a-header) 10 | - [Validation rules](#validation-rules) 11 | - [How to install & run](#how-to-install--run) 12 | - [Arguments needed](#arguments-needed) 13 | - [How to add a custom column validation rule](#how-to-add-a-custom-column-validation-rule) 14 | 15 | ### What this tool can do: 16 | The purpose of this tool is to validate comma separated value files. This tool needs the user to provide a validation schema as a json file and a file path of the file to be validated, or a folder path to validate multiple files in one run against the provided validation schema. 17 | 18 | ### Validation schema: 19 | Validation schema is a json file. Let's have a closer look at a real life example file. 20 | ```json 21 | { 22 | "file_metadata":{ 23 | "file_value_separator":",", 24 | "file_value_quote_char": "\"", 25 | "file_row_terminator":"\n", 26 | "file_has_header":true 27 | }, 28 | "file_validation_rules":{ 29 | "file_name_file_mask":"SalesJ", 30 | "file_extension":"csv", 31 | "file_size_range":[0,1], 32 | "file_row_count_range":[0,1000], 33 | "file_header_column_names":[ 34 | "Transaction_date", 35 | "Product", 36 | "Price", 37 | "Payment_Type", 38 | "Name", 39 | "City", 40 | "State", 41 | "Country", 42 | "Account_Created", 43 | "Last_Login", 44 | "Latitude", 45 | "Longitude" 46 | ] 47 | }, 48 | "column_validation_rules":{ 49 | "Transaction_date":{ 50 | "allow_data_type": "datetime.%M/%d/%y %H:%S" 51 | }, 52 | "Country":{ 53 | "allow_fixed_value_list":[ 54 | "Norway", 55 | "United States" 56 | ], 57 | "allow_regex":"[a-zA-Z].+", 58 | "allow_substring":"sub", 59 | "allow_data_type":"str" 60 | }, 61 | "Price":{ 62 | "allow_int_value_range":[0, 100000], 63 | "allow_fixed_value":1000, 64 | "allow_data_type":"int" 65 | }, 66 | "Latitude":{ 67 | "allow_float_value_range": [-42.5, 90.5] 68 | } 69 | } 70 | } 71 | ``` 72 | **Mandatory** objects in the validation schema json are: 73 | - `file_metadata` object containing these 4 keys: 74 | ```json 75 | "file_metadata":{ 76 | "file_value_separator":",", 77 | "file_value_quote_char": "\"", 78 | "file_row_terminator":"\n", 79 | "file_has_header":true 80 | }, 81 | ``` 82 | - at least one defined rule 83 | 84 | #### Validation schema for a file with a header: 85 | If validating a file that has a header, we have to set the `file_has_header` key to `true` and define the column names in the `column validation rules`. 86 | 87 | ```json 88 | { 89 | "file_metadata":{ 90 | "file_value_separator":",", 91 | "file_value_quote_char": "\"", 92 | "file_row_terminator":"\n", 93 | "file_has_header":true 94 | }, 95 | "file_validation_rules":{ 96 | "file_name_file_mask":"SalesJ", 97 | "file_extension":"csv", 98 | "file_size_range":[0,1], 99 | "file_row_count_range":[0,1000], 100 | "file_header_column_names":[ 101 | "Transaction_date", 102 | "Product", 103 | "Price", 104 | "Payment_Type", 105 | "Name", 106 | "City", 107 | "State", 108 | "Country", 109 | "Account_Created", 110 | "Last_Login", 111 | "Latitude", 112 | "Longitude" 113 | ] 114 | }, 115 | "column_validation_rules":{ 116 | "Transaction_date":{ 117 | "allow_data_type": "datetime.%M/%d/%y %H:%S" 118 | }, 119 | "Country":{ 120 | "allow_fixed_value_list":[ 121 | "Norway", 122 | "United States" 123 | ], 124 | "allow_regex":"[a-zA-Z].+", 125 | "allow_substring":"Norwayz", 126 | "allow_data_type":"str", 127 | "allow_fixed_value":"value" 128 | }, 129 | "Price":{ 130 | "allow_int_value_range":[0, 100000], 131 | "allow_fixed_value":1000, 132 | "allow_data_type":"int" 133 | }, 134 | "Latitude":{ 135 | "allow_float_value_range": [-42.5, 90.5] 136 | } 137 | } 138 | } 139 | ``` 140 | 141 | #### Validation schema for a file without a header: 142 | If validating a file that has no header, we have to set the `file_has_header` key to `false` and define the column indexes in the `column validation rules` so they're starting from 0 for the first column. 143 | ```json 144 | { 145 | "file_metadata":{ 146 | "file_value_separator":",", 147 | "file_value_quote_char": "\"", 148 | "file_row_terminator":"\n", 149 | "file_has_header":false 150 | }, 151 | "file_validation_rules":{ 152 | "file_name_file_mask":"SalesJ", 153 | "file_extension":"csv", 154 | "file_size_range":[0,1], 155 | "file_row_count_range":[0,1000] 156 | }, 157 | "column_validation_rules":{ 158 | "0":{ 159 | "allow_data_type": "datetime.%M/%d/%y %H:%S" 160 | }, 161 | "1":{ 162 | "allow_fixed_value_list":[ 163 | "Norway", 164 | "United States" 165 | ], 166 | "allow_regex":"[a-zA-Z].+", 167 | "allow_substring":"xzy", 168 | "allow_data_type":"str" 169 | }, 170 | "2":{ 171 | "allow_int_value_range":[0, 100000], 172 | "allow_fixed_value":1000, 173 | "allow_data_type":"int" 174 | }, 175 | "10":{ 176 | "allow_float_value_range": [-42.5, 90.5] 177 | } 178 | } 179 | } 180 | ``` 181 | ### Validation rules: 182 | - File level validation rules: 183 | - file_name_file_mask : checks file name matches the file mask regex pattern 184 | - file_extension : checks file extension is an exact match with the provided value 185 | - file_size_range : checks file size in MB is in the range of the provided values 186 | - file_row_count_range : checks file row count is in the range of the provided values 187 | - file_header_column_names : checks file header is an exact match with the provided value 188 | - Column level validation rules: 189 | - allow_data_type : checks column values are of the allowed data type ( allowed options: `str` , `int` , `float`, `datetime`, `datetime.<>`) 190 | - allow_int_value_range : checks integer column values are in the range of the provided values 191 | - allow_float_value_range : checks float column values are in the range of the provided values 192 | - allow_fixed_value_list : checks column values are in the provided value list 193 | - allow_regex : checks column values match the provided regex pattern 194 | - allow_substring : checks column values are a substring of the provided value 195 | - allow_fixed_value : checks column values are an exact match with the provided value 196 | 197 | 198 | ### How to install & run: 199 | - ideally create and activate a `virtual environment` or `pipenv` in order to safely install dependencies from `requirements.txt` using `pip install -r requirements.txt` 200 | - Set PYTHONPATH , from Windows CMD for example `set PYTHONPATH=%PYTHONPATH%;C:\csv_file_validator` 201 | - run using a command for example: `python C:\csv_file_validator\csv_file_validator -fl C:\csv_file_validator\tests\files\csv\with_header\SalesJan2009_with_header_correct_file.csv -cfg C:\csv_file_validator\tests\files\configs\config_with_header.json` 202 | 203 | - in `settings.conf` file 204 | - you can set the variable `RAISE_EXCEPTION_AND_HALT_ON_FAILED_VALIDATION` to `True` or `False`, this variable drives the behavior whether the tool stops validations after it hits a failed validation or not 205 | - you can set the variable `SKIP_COLUMN_VALIDATIONS_ON_EMPTY_FILE` to `True` or `False`, this variable drives the behavior whether the tool bypass the column level validations on a file that has no rows or not 206 | 207 | #### arguments needed: 208 | - `-fl` single file absolute path or absolute folder location (in case you need to validate multiple files from a directory in one app run) 209 | - `-cfg` configuration json file location absolute path 210 | 211 | ### How to add a custom column validation rule: 212 | Column validation rule interface: ![](/docs/img/my_new_validation_function_interface_diagram.png) 213 | >The keyword argument `validation_value` is the value in the config.json file, describing the allowed values for the validation rule 214 | 215 | >The keyword argument `column_value` is the value in the corresponding column in the .csv file being validated 216 | 217 | - Create a function in `/csv_file_validator/validation_functions.py` module and decorate it with `@logging_decorator` like this: 218 | 219 | ```python 220 | @logging_decorator 221 | def my_new_validation_function(kwargs): 222 | # example condition that validates the exact match of a validation_value and a column_value: 223 | if kwargs.get('validation_value') == kwargs.get('column_value'): 224 | # your validation condition success returns 0 225 | return 0 226 | # your validation condition fail returns 1 227 | return 1 228 | ``` 229 | - Add your function name to the registered validation name key - function mapping dictionary `_ATTRIBUTE_FUNC_MAP`. 230 | This dictionary is located at the end of the file `/csv_file_validator/validation_functions.py`. 231 | 232 | ```python 233 | "my_new_validation_function": my_new_validation_function 234 | ``` 235 | - For a column you wish to evaluate using this new validation rule, setup a validation function to validation value mapping in `config.json` 236 | 237 | ```json 238 | "my_column_name": { 239 | "my_new_validation_function": "some_validation_value" 240 | } 241 | ``` 242 | - If you need to define regex patterns in regex validation rules, check https://regex101.com/ 243 | -------------------------------------------------------------------------------- /csv_file_validator/validation_functions.py: -------------------------------------------------------------------------------- 1 | """ 2 | validation_functions module 3 | """ 4 | import functools 5 | import logging 6 | import os 7 | import re 8 | from datetime import datetime 9 | from decimal import Decimal, ROUND_HALF_EVEN 10 | from typing import Optional, Union 11 | 12 | from dateutil import parser 13 | 14 | from exceptions import InvalidConfigException 15 | 16 | LOGGER = logging.getLogger(__name__) 17 | 18 | 19 | def _log_validation_error(func_name: str, **kwargs) -> None: 20 | """ 21 | function responsible for handling the logging of the failed validations 22 | :param func_name: 23 | :param type: 24 | :param kwargs: 25 | :return: 26 | """ 27 | 28 | logged_string: str = ( 29 | f'{func_name} - failed to meet this value : {kwargs.get("validation_value")}' 30 | ) 31 | 32 | if kwargs.get("row_number"): 33 | logged_string += f' - Row#: {kwargs["row_number"]}' 34 | if kwargs.get("column"): 35 | logged_string += f' - Column name: {kwargs["column"]}' 36 | if kwargs.get("column_value"): 37 | logged_string += f' - Column value: {kwargs["column_value"]}' 38 | if kwargs.get("Exception"): 39 | logged_string += f' - Exception: {kwargs["Exception"]}' 40 | 41 | LOGGER.error(logged_string) 42 | 43 | 44 | def logging_decorator(func): 45 | """ 46 | logging decorator for validation functions 47 | :param func: 48 | :return: 49 | """ 50 | 51 | @functools.wraps(func) 52 | def wrapper_decorator(**kwargs): 53 | try: 54 | validation_result: int = func(**kwargs) 55 | except ( 56 | ValueError, 57 | TypeError, 58 | KeyError, 59 | IndexError, 60 | AttributeError, 61 | ArithmeticError, 62 | ) as err: 63 | # in case validation function raised Error, 64 | # still need to add one more failed validation 65 | # for the __main__ error counter 66 | validation_result = 1 67 | kwargs["Exception"] = err 68 | except Exception as exc: 69 | raise RuntimeError(f"Unexpected Exception {exc} in {func.__name__}") 70 | 71 | if validation_result > 0: 72 | _log_validation_error(func_name=func.__name__, **kwargs) 73 | 74 | return validation_result 75 | 76 | return wrapper_decorator 77 | 78 | 79 | @logging_decorator 80 | def check_file_extension(**kwargs) -> int: 81 | """ 82 | validation function checking the file extension is equal to the expected value 83 | :param kwargs: 84 | :return: 85 | """ 86 | if os.path.splitext(kwargs.get("file_name"))[1][1:] == kwargs.get( 87 | "validation_value" 88 | ): 89 | return 0 90 | return 1 91 | 92 | 93 | @logging_decorator 94 | def check_file_mask(**kwargs) -> int: 95 | """ 96 | validation function checking the file name file mask against a provided regex expr. 97 | :param kwargs: 98 | :return: 99 | """ 100 | full_path_file_name: str = os.path.split(kwargs.get("file_name"))[-1] 101 | dot_index: int = full_path_file_name.rfind(".") 102 | filename: str = full_path_file_name[:dot_index] 103 | 104 | if re.match(kwargs.get("validation_value"), filename): 105 | return 0 106 | return 1 107 | 108 | 109 | @logging_decorator 110 | def check_file_size_range(**kwargs) -> int: 111 | """ 112 | validation function checking file size in MB is inside a numeric range 113 | provided by the list of int values [min value, max value] 114 | :param kwargs: 115 | :return: 116 | """ 117 | if ( 118 | kwargs.get("validation_value")[1] 119 | >= kwargs.get("file_size") 120 | >= kwargs.get("validation_value")[0] 121 | ): 122 | return 0 123 | return 1 124 | 125 | 126 | @logging_decorator 127 | def check_file_row_count_range(**kwargs) -> int: 128 | """ 129 | validation function checking file row count is inside a numeric range 130 | provided by the list of int values [min value, max value] 131 | :param kwargs: 132 | :return: 133 | """ 134 | if ( 135 | kwargs.get("validation_value")[0] 136 | <= kwargs.get("file_row_count") 137 | <= kwargs.get("validation_value")[1] 138 | ): 139 | return 0 140 | return 1 141 | 142 | 143 | @logging_decorator 144 | def check_file_header_column_names(**kwargs) -> int: 145 | """ 146 | validation function checking file header row is equal to the expected header row 147 | :param kwargs: 148 | :return: 149 | """ 150 | if kwargs.get("validation_value") == kwargs.get("file_header"): 151 | return 0 152 | return 1 153 | 154 | 155 | @logging_decorator 156 | def check_column_allow_data_type(**kwargs) -> int: 157 | """ 158 | validation function checking column value data type is equal to the expected data type 159 | :param kwargs: 160 | :return: 161 | """ 162 | if kwargs.get("validation_value") == "str": 163 | if str(kwargs.get("column_value")): 164 | return 0 165 | elif kwargs.get("validation_value") == "int": 166 | if kwargs.get("column_value").isdigit(): 167 | return 0 168 | elif kwargs.get("validation_value") == "float": 169 | if "." in kwargs.get("column_value"): 170 | float(kwargs.get("column_value")) 171 | return 0 172 | elif kwargs.get("validation_value") == "datetime": 173 | if parser.parse(kwargs.get("column_value")): 174 | return 0 175 | elif kwargs.get("validation_value").startswith("datetime."): 176 | datetime_w_format = kwargs.get("validation_value") 177 | dot_index = datetime_w_format.find(".") + 1 178 | fmt = datetime_w_format[dot_index:] 179 | datetime.strptime(kwargs.get("column_value"), fmt) 180 | return 0 181 | return 1 182 | 183 | 184 | @logging_decorator 185 | def check_column_allow_int_value_range(**kwargs) -> int: 186 | """ 187 | validation function checking column value is inside a integer value range 188 | provided by the list of int values [min value, max value] 189 | :param kwargs: 190 | :return: 191 | """ 192 | if ( 193 | kwargs.get("validation_value")[0] 194 | <= int(kwargs.get("column_value")) 195 | <= kwargs.get("validation_value")[1] 196 | ): 197 | return 0 198 | return 1 199 | 200 | 201 | @logging_decorator 202 | def check_column_allow_float_value_range(**kwargs) -> int: 203 | """ 204 | validation function checking column value is inside a float value range 205 | provided by the list of float values [min value, max value] 206 | :param kwargs: 207 | :return: 208 | """ 209 | lower_range: Decimal = Decimal(kwargs.get("validation_value")[0]).quantize( 210 | Decimal(".01"), rounding = ROUND_HALF_EVEN 211 | ) 212 | upper_range: Decimal = Decimal(kwargs.get("validation_value")[1]).quantize( 213 | Decimal(".01"), rounding = ROUND_HALF_EVEN 214 | ) 215 | column_value: Decimal = Decimal(kwargs.get("column_value")).quantize( 216 | Decimal(".01"), rounding = ROUND_HALF_EVEN 217 | ) 218 | 219 | if lower_range.compare(column_value) < 0 < upper_range.compare(column_value): 220 | return 0 221 | return 1 222 | 223 | 224 | @logging_decorator 225 | def check_column_allow_fixed_value_list(**kwargs) -> int: 226 | """ 227 | validation function checking column value is in a expected list of values 228 | :param kwargs: 229 | :return: 230 | """ 231 | if kwargs.get("column_value") in [str(x) for x in kwargs.get("validation_value")]: 232 | return 0 233 | return 1 234 | 235 | 236 | @logging_decorator 237 | def check_column_allow_fixed_value(**kwargs) -> int: 238 | """ 239 | validation function checking column value is equal to a expected value 240 | :param kwargs: 241 | :return: 242 | """ 243 | if kwargs.get("column_value") == str(kwargs.get("validation_value")): 244 | return 0 245 | return 1 246 | 247 | 248 | @logging_decorator 249 | def check_column_allow_substring(**kwargs) -> int: 250 | """ 251 | validation function checking column value is a substring of a provided string 252 | :param kwargs: 253 | :return: 254 | """ 255 | if kwargs.get("column_value") in str(kwargs.get("validation_value")): 256 | return 0 257 | return 1 258 | 259 | 260 | @logging_decorator 261 | def check_column_allow_regex(**kwargs) -> int: 262 | """ 263 | validation function checking column value against a provided regex expr. 264 | :param kwargs: 265 | :return: 266 | """ 267 | if re.match(kwargs.get("validation_value"), kwargs.get("column_value")): 268 | return 0 269 | return 1 270 | 271 | 272 | @logging_decorator 273 | def check_column_allow_unique_value(**kwargs) -> int: 274 | """ 275 | validation function checking if column value is unique in the file. 276 | :param kwargs: 277 | :return: 278 | """ 279 | field_name = kwargs.get("column") 280 | 281 | if field_name in _UNIQUE_VALUE_FIELD_MAP: 282 | field_value_set = _UNIQUE_VALUE_FIELD_MAP[field_name] 283 | else: 284 | _UNIQUE_VALUE_FIELD_MAP[field_name] = field_value_set = set() 285 | 286 | if kwargs.get("column_value") in field_value_set: 287 | return 1 288 | else: 289 | field_value_set.add(kwargs.get("column_value")) 290 | 291 | return 0 292 | 293 | 294 | @logging_decorator 295 | def check_column_allow_null_value(**kwargs) -> int: 296 | """ 297 | validation function checking if column value is null. 298 | :param kwargs: 299 | :return: 300 | """ 301 | return_value = -1 302 | 303 | if kwargs.get("validation_value"): 304 | if not kwargs.get("column_value"): 305 | return_value = 0 306 | else: 307 | if not kwargs.get("column_value"): 308 | return_value = 1 309 | 310 | return return_value 311 | 312 | 313 | def execute_mapped_validation_function(attribute, **kwargs): 314 | """ 315 | mapping method between config rules and validation functions 316 | :param attribute: 317 | :param kwargs: 318 | :return: 319 | """ 320 | if attribute in _ATTRIBUTE_FUNC_MAP.keys(): 321 | func = _ATTRIBUTE_FUNC_MAP[attribute] 322 | return_value: Optional[Union[str, int]] = func(**kwargs) 323 | else: 324 | raise InvalidConfigException( 325 | f"function {attribute} not found in " f"function_caller attribute_func_map" 326 | ) 327 | 328 | return return_value 329 | 330 | 331 | def execute_mapped_defining_validation_function(attribute, **kwargs): 332 | """ 333 | mapping method between config rules and validation functions 334 | :param attribute: 335 | :param kwargs: 336 | :return: 337 | """ 338 | 339 | return_value = 2 340 | 341 | if attribute in _DEFINING_ATTRIBUTE_FUNC_MAP.keys(): 342 | func = _DEFINING_ATTRIBUTE_FUNC_MAP[attribute] 343 | return_value: Optional[Union[str, int]] = func(**kwargs) 344 | 345 | return return_value 346 | 347 | 348 | _DEFINING_ATTRIBUTE_FUNC_MAP: dict = { 349 | "allow_null_value": check_column_allow_null_value, 350 | } 351 | 352 | 353 | _ATTRIBUTE_FUNC_MAP: dict = { 354 | "file_name_file_mask": check_file_mask, 355 | "file_extension": check_file_extension, 356 | "file_size_range": check_file_size_range, 357 | "file_row_count_range": check_file_row_count_range, 358 | "file_header_column_names": check_file_header_column_names, 359 | "allow_data_type": check_column_allow_data_type, 360 | "allow_int_value_range": check_column_allow_int_value_range, 361 | "allow_float_value_range": check_column_allow_float_value_range, 362 | "allow_fixed_value_list": check_column_allow_fixed_value_list, 363 | "allow_regex": check_column_allow_regex, 364 | "allow_substring": check_column_allow_substring, 365 | "allow_fixed_value": check_column_allow_fixed_value, 366 | "allow_unique_value": check_column_allow_unique_value, 367 | } 368 | 369 | 370 | _UNIQUE_VALUE_FIELD_MAP: dict = {} 371 | -------------------------------------------------------------------------------- /tests/test_functional.py: -------------------------------------------------------------------------------- 1 | import json 2 | import logging 3 | import os 4 | 5 | import pytest 6 | 7 | from csv_file_validator.__main__ import process_file, ValidationResultEnum 8 | from csv_file_validator.config import Config, \ 9 | get_validated_config 10 | from csv_file_validator.exceptions import InvalidConfigException 11 | from csv_file_validator.settings_parser import Settings 12 | 13 | 14 | class TestsFunctionalConfig: 15 | def test_correct_config_model1(self): 16 | correct_config = { 17 | "file_metadata": {"file_value_separator": ",", 18 | "file_row_terminator": "\n", 19 | "file_value_quote_char": "\"", 20 | "file_has_header": True}, 21 | "file_validation_rules": {"file_name_file_mask": ".+\\d+"}, 22 | "column_validation_rules": {} 23 | } 24 | config = Config(**correct_config) 25 | 26 | assert config 27 | 28 | assert get_validated_config(correct_config) 29 | 30 | def test_correct_config_model2(self): 31 | correct_config = { 32 | "file_metadata": {"file_value_separator": ",", 33 | "file_row_terminator": "\n", 34 | "file_value_quote_char": "\"", 35 | "file_has_header": True}, 36 | "file_validation_rules": {"file_name_file_mask": ".+\\d+"}, 37 | } 38 | 39 | assert get_validated_config(correct_config) 40 | 41 | def test_incorrect_config_model1(self): 42 | incorrect_config = { 43 | "file_metadata": {"some_invalid_key": True, 44 | "file_row_terminator": "\n"}, 45 | "file_validation_rules": {"file_name_file_mask": ".+\\d+"}, 46 | "column_validation_rules": [] 47 | } 48 | 49 | with pytest.raises(TypeError): 50 | Config(**incorrect_config) 51 | 52 | with pytest.raises(InvalidConfigException): 53 | get_validated_config(incorrect_config) 54 | 55 | def test_incorrect_config_model2(self): 56 | incorrect_config = { 57 | "file_metadata": {"file_row_terminator": "\n"}, 58 | "file_validation_rules": {"file_name_file_mask": ".+\\d+"}, 59 | "column_validation_rules": [] 60 | } 61 | 62 | with pytest.raises(TypeError): 63 | Config(**incorrect_config) 64 | 65 | with pytest.raises(InvalidConfigException): 66 | get_validated_config(incorrect_config) 67 | 68 | def test_incorrect_config_model3(self): 69 | incorrect_config = { 70 | "file_metadata": {"file_value_separator": ",", 71 | "file_row_terminator": "\n", 72 | "file_value_quote_char": "\"", 73 | "file_has_header": "yes"}, 74 | "file_validation_rules": {"file_name_file_mask": ".+\\d+"}, 75 | "column_validation_rules": [] 76 | } 77 | 78 | with pytest.raises(ValueError): 79 | Config(**incorrect_config) 80 | 81 | with pytest.raises(InvalidConfigException): 82 | get_validated_config(incorrect_config) 83 | 84 | def test_empty_config_model(self): 85 | empty_config = { 86 | "file_metadata": {}, 87 | "file_validation_rules": {}, 88 | "column_validation_rules": {} 89 | } 90 | 91 | with pytest.raises(TypeError): 92 | Config(**empty_config) 93 | 94 | with pytest.raises(InvalidConfigException): 95 | get_validated_config(empty_config) 96 | 97 | 98 | class TestsFunctionalValidation: 99 | @staticmethod 100 | def open_config_file(config): 101 | with open(config, mode='r') as json_file: 102 | parsed_config = json.load(json_file) 103 | return Config(**parsed_config) 104 | 105 | def test_correct_file_with_header(self, caplog): 106 | args = {'file_loc': os.getcwd() + '/files/csv/with_header/SalesJan2009_with_header_correct_file.csv', 107 | 'config': os.getcwd() + '/files/configs/config_with_header.json'} 108 | 109 | parsed_config = TestsFunctionalValidation.open_config_file(args['config']) 110 | 111 | settings = Settings(**{'skip_column_validations_on_empty_file': True, 112 | 'raise_exception_and_halt_on_failed_validation': False}) 113 | 114 | caplog.set_level(logging.INFO) 115 | 116 | assert ValidationResultEnum.SUCCESS == process_file(parsed_config, settings, args['file_loc']) 117 | 118 | assert f"Validation of {args['file_loc']} finished without any errors" in caplog.text 119 | 120 | def test_correct_file_without_header(self, caplog): 121 | args = {'file_loc': os.getcwd() + '/files/csv/without_header/SalesJan2009_without_header_correct_file.csv', 122 | 'config': os.getcwd() + '/files/configs/config_without_header.json'} 123 | 124 | parsed_config = TestsFunctionalValidation.open_config_file(args['config']) 125 | 126 | settings = Settings(**{'skip_column_validations_on_empty_file': True, 127 | 'raise_exception_and_halt_on_failed_validation': False}) 128 | 129 | caplog.set_level(logging.INFO) 130 | 131 | assert ValidationResultEnum.SUCCESS == process_file(parsed_config, settings, args['file_loc']) 132 | 133 | assert f"Validation of {args['file_loc']} finished without any errors" in caplog.text 134 | 135 | def test_incorrect_file_with_header(self, caplog): 136 | args = {'file_loc': os.getcwd() + '/files/csv/with_header/SalesJan2009_with_header_incorrect_file.csv', 137 | 'config': os.getcwd() + '/files/configs/config_with_header.json'} 138 | 139 | parsed_config = TestsFunctionalValidation.open_config_file(args['config']) 140 | 141 | settings = Settings(**{'skip_column_validations_on_empty_file': True, 142 | 'raise_exception_and_halt_on_failed_validation': False}) 143 | 144 | caplog.set_level(logging.ERROR) 145 | 146 | assert ValidationResultEnum.FAILURE == process_file(parsed_config, settings, args['file_loc']) 147 | 148 | assert 'check_column_allow_int_value_range - failed to meet this value' in caplog.text 149 | 150 | def test_incorrect_file_without_header(self, caplog): 151 | args = {'file_loc': os.getcwd() + '/files/csv/without_header/SalesJan2009_without_header_incorrect_file.csv', 152 | 'config': os.getcwd() + '/files/configs/config_without_header.json'} 153 | 154 | parsed_config = TestsFunctionalValidation.open_config_file(args['config']) 155 | 156 | settings = Settings(**{'skip_column_validations_on_empty_file': True, 157 | 'raise_exception_and_halt_on_failed_validation': False}) 158 | 159 | caplog.set_level(logging.ERROR) 160 | 161 | assert ValidationResultEnum.FAILURE == process_file(parsed_config, settings, args['file_loc']) 162 | 163 | assert 'failed to meet this value' in caplog.text 164 | 165 | def test_missing_file(self, caplog): 166 | args = {'file_loc': os.getcwd() + '/files/csv/MISSING_FILE.csv', 167 | 'config': os.getcwd() + '/files/configs/config_with_header.json'} 168 | 169 | parsed_config = TestsFunctionalValidation.open_config_file(args['config']) 170 | 171 | settings = Settings(**{'skip_column_validations_on_empty_file': True, 172 | 'raise_exception_and_halt_on_failed_validation': False}) 173 | 174 | caplog.set_level(logging.ERROR) 175 | 176 | assert ValidationResultEnum.COULD_NOT_PROCESS == process_file(parsed_config, settings, args['file_loc']) 177 | 178 | assert f'File {args["file_loc"]} setup raised issues, [Errno 2] No such file or directory:' in caplog.text 179 | 180 | def test_empty_file_skip_column_validations_with_header(self, caplog): 181 | args = {'file_loc': os.getcwd() + '/files/csv/with_header/SalesJan2009_with_header_empty_file.csv', 182 | 'config': os.getcwd() + '/files/configs/config_with_header.json'} 183 | 184 | parsed_config = TestsFunctionalValidation.open_config_file(args['config']) 185 | 186 | settings = Settings(**{'skip_column_validations_on_empty_file': True, 187 | 'raise_exception_and_halt_on_failed_validation': False}) 188 | 189 | caplog.set_level(logging.INFO) 190 | 191 | assert ValidationResultEnum.SUCCESS == process_file(parsed_config, settings, args['file_loc']) 192 | 193 | assert 'File has no rows to validate, skipping column level validations' in caplog.text 194 | 195 | def test_empty_file_dont_skip_column_validations_with_header(self, caplog): 196 | args = {'file_loc': os.getcwd() + '/files/csv/with_header/SalesJan2009_with_header_empty_file.csv', 197 | 'config': os.getcwd() + '/files/configs/config_with_header.json'} 198 | 199 | parsed_config = TestsFunctionalValidation.open_config_file(args['config']) 200 | 201 | settings = Settings(**{'skip_column_validations_on_empty_file': False, 202 | 'raise_exception_and_halt_on_failed_validation': False}) 203 | 204 | caplog.set_level(logging.INFO) 205 | 206 | assert ValidationResultEnum.SUCCESS == process_file(parsed_config, settings, args['file_loc']) 207 | 208 | assert 'Found 4 column validations' in caplog.text 209 | 210 | def test_empty_file_skip_column_validations_without_header(self, caplog): 211 | args = {'file_loc': os.getcwd() + '/files/csv/without_header/SalesJan2009_without_header_empty_file.csv', 212 | 'config': os.getcwd() + '/files/configs/config_without_header.json'} 213 | 214 | parsed_config = TestsFunctionalValidation.open_config_file(args['config']) 215 | 216 | settings = Settings(**{'skip_column_validations_on_empty_file': True, 217 | 'raise_exception_and_halt_on_failed_validation': False}) 218 | 219 | caplog.set_level(logging.INFO) 220 | 221 | assert ValidationResultEnum.SUCCESS == process_file(parsed_config, settings, args['file_loc']) 222 | 223 | assert 'File has no rows to validate, skipping column level validations' in caplog.text 224 | 225 | def test_config_without_header_file_with_header(self, caplog): 226 | args = {'file_loc': os.getcwd() + '/files/csv/with_header/SalesJan2009_with_header_correct_file.csv', 227 | 'config': os.getcwd() + '/files/configs/config_without_header.json'} 228 | 229 | parsed_config = TestsFunctionalValidation.open_config_file(args['config']) 230 | 231 | settings = Settings(**{'skip_column_validations_on_empty_file': True, 232 | 'raise_exception_and_halt_on_failed_validation': False}) 233 | 234 | caplog.set_level(logging.ERROR) 235 | 236 | assert ValidationResultEnum.FAILURE == process_file(parsed_config, settings, args['file_loc']) 237 | 238 | assert 'check_column_allow_data_type - failed to meet this value' in caplog.text 239 | 240 | def test_config_with_header_file_without_header(self, caplog): 241 | args = {'file_loc': os.getcwd() + '/files/csv/without_header/SalesJan2009_without_header_correct_file.csv', 242 | 'config': os.getcwd() + '/files/configs/config_with_header.json'} 243 | 244 | parsed_config = TestsFunctionalValidation.open_config_file(args['config']) 245 | 246 | settings = Settings(**{'skip_column_validations_on_empty_file': True, 247 | 'raise_exception_and_halt_on_failed_validation': False}) 248 | 249 | caplog.set_level(logging.ERROR) 250 | 251 | assert ValidationResultEnum.FAILURE == process_file(parsed_config, settings, args['file_loc']) 252 | 253 | assert "check_file_header_column_names - failed to meet this value : ['Transaction_date', 'Product', 'Price', 'Payment_Type', 'Name', 'City', 'State', 'Country', 'Account_Created', 'Last_Login', 'Latitude', 'Longitude']" in caplog.text 254 | 255 | def test_empty_file_dont_skip_column_validations_without_header(self, caplog): 256 | args = {'file_loc': os.getcwd() + '/files/csv/without_header/SalesJan2009_without_header_empty_file.csv', 257 | 'config': os.getcwd() + '/files/configs/config_without_header.json'} 258 | 259 | parsed_config = TestsFunctionalValidation.open_config_file(args['config']) 260 | 261 | settings = Settings(**{'skip_column_validations_on_empty_file': False, 262 | 'raise_exception_and_halt_on_failed_validation': False}) 263 | 264 | caplog.set_level(logging.INFO) 265 | 266 | assert ValidationResultEnum.FAILURE == process_file(parsed_config, settings, args['file_loc']) 267 | 268 | assert "Column validations set in the config, but none of the expected columns found in the file" in caplog.text 269 | 270 | def test_inconsistent_file_with_header(self, caplog): 271 | args = { 272 | 'file_loc': os.getcwd() + '/files/csv/without_header/SalesJan2009_without_header_inconsistent_columns_file.csv', 273 | 'config': os.getcwd() + '/files/configs/config_without_header.json'} 274 | 275 | parsed_config = TestsFunctionalValidation.open_config_file(args['config']) 276 | 277 | settings = Settings(**{'skip_column_validations_on_empty_file': True, 278 | 'raise_exception_and_halt_on_failed_validation': False}) 279 | 280 | caplog.set_level(logging.ERROR) 281 | 282 | assert ValidationResultEnum.FAILURE == process_file(parsed_config, settings, args['file_loc']) 283 | 284 | assert 'SalesJan2009_without_header_inconsistent_columns_file.csv cannot be validated, column count is not consistent, row' in caplog.text 285 | 286 | def test_inconsistent_file_without_header(self, caplog): 287 | args = { 288 | 'file_loc': os.getcwd() + '/files/csv/without_header/SalesJan2009_without_header_inconsistent_columns_file.csv', 289 | 'config': os.getcwd() + '/files/configs/config_without_header.json'} 290 | 291 | parsed_config = TestsFunctionalValidation.open_config_file(args['config']) 292 | 293 | settings = Settings(**{'skip_column_validations_on_empty_file': True, 294 | 'raise_exception_and_halt_on_failed_validation': False}) 295 | 296 | caplog.set_level(logging.ERROR) 297 | 298 | assert ValidationResultEnum.FAILURE == process_file(parsed_config, settings, args['file_loc']) 299 | 300 | assert 'SalesJan2009_without_header_inconsistent_columns_file.csv cannot be validated, column count is not consistent, row' in caplog.text 301 | -------------------------------------------------------------------------------- /tests/files/csv/without_header/SalesJan2009_without_header_incorrect_file.csv: -------------------------------------------------------------------------------- 1 | 1/2/09 6:17,Product1,1200,Mastercard,carolina,Basildon,England,United Kingdom,1/2/09 6:00,1/2/09 6:08,51.5,-1.1166667 1/2/09 4:53,Product1,1200,Visa,Betina,Parkville ,MO,United States,1/2/09 4:42,1/2/09 7:49,39.195,-94.68194 1/2/09 13:08,Product1,1200,Mastercard,Federica e Andrea,Astoria ,OR,United States,1/1/09 16:21,1/3/09 12:32,46.18806,-123.83 1/3/09 14:44,Product1,1200,Visa,Gouya,Echuca,Victoria,Australia,9/25/05 21:13,1/3/09 14:22,-36.1333333,144.75 1/4/09 12:56,Product2,3600,Visa,Gerd W ,Cahaba Heights ,AL,United States,11/15/08 15:47,1/4/09 12:45,330000.52056,-86.8025 1/4/09 13:19,Product1,1200,Visa,LAURENCE,Mickleton ,NJ,United States,9/24/08 15:19,1/4/09 13:04,39.79,-75.23806 1/4/09 20:11,Product1,1200,Mastercard,Fleur,Peoria ,IL,United States,1/3/09 9:38,1/4/09 19:45,40.69361,-89.58889 1/2/09 20:09,Product1,1200,Mastercard,adam,Martin ,TN,United States,1/2/09 17:43,1/4/09 20:01,36.34333,-88.85028 1/4/09 13:17,Product1,1200,Mastercard,Renee Elisabeth,Tel Aviv,Tel Aviv,Israel,1/4/09 13:03,1/4/09 22:10,32.0666667,34.7666667 1/4/09 14:11,Product1,1200,Visa,Aidan,Chatou,Ile-de-France,France,6/3/08 4:22,1/5/09 1:17,48.8833333,2.15 1/5/09 2:42,Product1,1200,Diners,Stacy,New York ,NY,United States,1/5/09 2:23,1/5/09 4:59,40.71417,-74.00639 1/5/09 5:39,Product1,1200,Amex,Heidi,Eindhoven,Noord-Brabant,Netherlands,1/5/09 4:55,1/5/09 8:15,51.45,5.4666667 1/2/09 9:16,Product1,1200,Mastercard,Sean ,Shavano Park ,TX,United States,1/2/09 8:32,1/5/09 9:05,29.42389,-98.49333 1/5/09 10:08,Product1,1200,Visa,Georgia,Eagle ,ID,United States,11/11/08 15:53,1/5/09 10:05,43.69556,-116.35306 1/2/09 14:18,Product1,1200,Visa,Richard,Riverside ,NJ,United States,12/9/08 12:07,1/5/09 11:01,40.03222,-74.95778 1/4/09 1:05,Product1,1200,Diners,Leanne,Julianstown,Meath,Ireland,1/4/09 0:00,1/5/09 13:36,53.6772222,-6.3191667 1/5/09 11:37,Product1,1200,Visa,Janet,Ottawa,Ontario,Canada,1/5/09 9:35,1/5/09 19:24,45.4166667,-75.7 1/6/09 5:02,Product1,1200,Diners,barbara,Hyderabad,Andhra Pradesh,India,1/6/09 2:41,1/6/09 7:52,17.3833333,78.4666667 1/6/09 7:45,Product2,3600,Visa,Sabine,London,England,United Kingdom,1/6/09 7:00,1/6/09 9:17,51.52721,0.14559 1/2/09 7:35,Product1,1200,Diners,Hani,Salt Lake City ,UT,United States,12/30/08 5:44,1/6/09 10:52,40.76083,-111.89028 1/6/09 12:56,Product1,1200,Visa,Jeremy,Manchester,England,United Kingdom,1/6/09 10:58,1/6/09 13:31,53.5,-2.2166667 1/1/09 11:05,Product1,1200,Diners,Janis,Ballynora,Cork,Ireland,12/10/07 12:37,1/7/09 1:52,51.8630556,-8.58 1/5/09 4:10,Product1,1200,Mastercard,Nicola,Roodepoort,Gauteng,South Africa,1/5/09 2:33,1/7/09 5:13,-26.1666667,27.8666667 1/6/09 7:18,Product1,1200,Visa,asuman,Chula Vista ,CA,United States,1/6/09 7:07,1/7/09 7:08,32.64,-117.08333 1/2/09 1:11,Product1,1200,Mastercard,Lena,Kuopio,Ita-Suomen Laani,Finland,12/31/08 2:48,1/7/09 10:20,62.9,27.6833333 1/1/09 2:24,Product1,1200,Visa,Lisa,Sugar Land ,TX,United States,1/1/09 1:56,1/7/09 10:52,29.61944,-95.63472 1/7/09 8:08,Product1,1200,Diners,Bryan Kerrene,New York ,NY,United States,1/7/09 7:39,1/7/09 12:38,40.71417,-74.00639 1/2/09 2:57,Product1,1200,Visa,chris,London,England,United Kingdom,1/3/08 7:23,1/7/09 13:14,51.52721,0.14559 1/1/09 20:21,Product1,1200,Visa,Maxine,Morton ,IL,United States,10/24/08 6:48,1/7/09 20:49,40.61278,-89.45917 1/8/09 0:42,Product1,1200,Visa,Family,Los Gatos ,CA,United States,1/8/09 0:28,1/8/09 3:39,37.22667,-121.97361 1/8/09 3:56,Product1,1200,Mastercard,Katherine,New York ,NY,United States,1/8/09 3:33,1/8/09 6:19,40.71417,-74.00639 1/8/09 3:16,Product1,1200,Mastercard,Linda,Miami ,FL,United States,1/8/09 3:06,1/8/09 6:34,25.77389,-80.19389 1/8/09 1:59,Product1,1200,Mastercard,SYLVIA,Vesenaz,Geneve,Switzerland,11/28/07 11:56,1/8/09 7:20,46.2333333,6.2 1/3/09 9:03,Product1,1200,Diners,Sheila,Brooklyn ,NY,United States,1/3/09 8:47,1/8/09 10:38,40.65,-73.95 1/5/09 13:17,Product1,1200,Mastercard,Stephanie,Badhoevedorp,Noord-Holland,Netherlands,1/5/09 12:45,1/8/09 11:45,52.3333333,4.7833333 1/6/09 7:46,Product1,1200,Amex,Kelly,Reston ,VA,United States,1/6/09 7:30,1/8/09 12:40,38.96861,-77.34139 1/5/09 20:00,Product2,3600,Visa,James,Burpengary,Queensland,Australia,12/10/08 19:53,1/8/09 17:58,-27.1666667,152.95 1/8/09 16:24,Product1,1200,Visa,jennifer,Phoenix ,AZ,United States,1/8/09 15:57,1/8/09 18:30,33.44833,-112.07333 1/9/09 6:39,Product1,1200,Mastercard,Anneli,Houston ,TX,United States,1/9/09 5:09,1/9/09 7:11,29.76306,-95.36306 1/6/09 22:19,Product2,3600,Amex,Ritz,Pittsfield ,VT,United States,1/6/09 12:00,1/9/09 10:05,43.77222,-72.81333 1/6/09 23:00,Product2,3600,Amex,Sylvia,Pittsfield ,VT,United States,1/6/09 12:00,1/9/09 10:05,43.77222,-72.81333 1/7/09 7:44,Product1,1200,Mastercard,Marie,Ball Ground ,GA,United States,1/7/09 5:35,1/9/09 10:52,34.33806,-84.37667 1/3/09 13:24,Product1,1200,Visa,Mehmet Fatih,Helsingor,Frederiksborg,Denmark,1/3/09 12:47,1/9/09 11:14,56.0333333,12.6166667 1/7/09 15:12,Product2,3600,Visa,Anabela,Flossmoor ,IL,United States,1/5/09 19:55,1/9/09 16:03,41.54278,-87.68472 1/7/09 20:15,Product1,1200,Amex,Nicole,Houston ,TX,United States,1/7/09 17:17,1/9/09 20:02,29.76306,-95.36306 1/3/09 10:11,Product2,3600,Visa,Christiane ,Delray Beach ,FL,United States,1/3/09 9:27,1/10/09 9:46,26.46111,-80.07306 1/9/09 15:58,Product1,1200,Mastercard,Sari,Newbury,England,United Kingdom,1/9/09 14:53,1/10/09 13:16,51.4,-1.3166667 1/3/09 13:11,Product1,1200,Mastercard,simone,Kobenhavn,Kobenhavn,Denmark,10/31/08 0:31,1/10/09 13:24,55.6666667,12.5833333 1/10/09 12:57,Product1,1200,Amex,Vanessa,Sandy Springs ,GA,United States,2/7/07 20:16,1/10/09 14:09,33.92417,-84.37861 1/10/09 14:43,Product1,1200,Diners,Anupam,Kinsaley,Dublin,Ireland,1/9/09 11:38,1/10/09 14:37,53.4247222,-6.1758333 1/10/09 12:05,Product1,1200,Visa,Karina,Fort Lauderdale ,FL,United States,7/1/08 12:53,1/10/09 16:33,26.12194,-80.14361 1/6/09 1:20,Product1,1200,Mastercard,Frank,Melbourne,Victoria,Australia,1/2/09 17:51,1/10/09 18:27,-37.8166667,144.9666667 1/10/09 14:56,Product1,1200,Visa,Angela,Ankeny ,IA,United States,1/8/09 3:06,1/10/09 19:41,41.72972,-93.60556 1/7/09 10:01,Product1,1200,Visa,Darren,Pittsboro ,NC,United States,1/7/09 9:04,1/10/09 20:02,35.72,-79.1775 1/1/09 1:26,Product1,1200,Mastercard,Nikki,New Rochelle ,NY,United States,1/1/09 0:58,1/10/09 21:31,40.91139,-73.78278 1/11/09 2:04,Product1,1200,Visa,chris,Gold Coast,Queensland,Australia,1/11/09 0:33,1/11/09 2:11,-28,153.4333333 1/11/09 14:17,Product1,1200,Visa,Stephanie,Brussels,Brussels (Bruxelles),Belgium,1/11/09 13:39,1/11/09 13:39,50.8333333,4.3333333 1/10/09 21:38,Product1,1200,Visa,Anushka,Maple Ridge District Municipality,British Columbia,Canada,1/10/09 21:17,1/11/09 19:32,49.25,-122.5 1/7/09 6:18,Product1,1200,Mastercard,June ,Beachwood ,OH,United States,2/23/06 11:56,1/11/09 19:35,41.46444,-81.50889 1/4/09 8:39,Product2,3600,Diners,Baybars,Prince Albert,Saskatchewan,Canada,1/3/09 17:17,1/11/09 21:05,53.2,-105.75 1/5/09 0:31,Product1,1200,Mastercard,Bonnie,Saltsjobaden,Stockholm,Sweden,1/4/09 23:45,1/12/09 0:37,59.2833333,18.3 1/2/09 6:07,Product1,1200,Visa,Cindy ,Kemble,England,United Kingdom,12/30/08 10:21,1/12/09 2:24,51.6766667,-2.0180556 1/12/09 3:25,Product1,1200,Mastercard,chrissy,W Lebanon ,NH,United States,1/12/09 3:12,1/12/09 3:22,43.64917,-72.31083 1/4/09 13:56,Product1,1200,Mastercard,Tamar,Headley,England,United Kingdom,11/29/07 9:23,1/12/09 5:38,51.1166667,-0.8166667 1/7/09 0:12,Product2,3600,Mastercard,Deirdre,Lausanne,Vaud,Switzerland,12/1/08 6:25,1/12/09 6:55,46.5333333,6.6666667 1/12/09 5:18,Product1,1200,Mastercard,Bernadett,Southampton,England,United Kingdom,1/12/09 4:45,1/12/09 8:08,50.9,-1.4 1/8/09 15:16,Product1,1200,Visa,Dottie,Woodsboro ,MD,United States,1/8/09 14:56,1/12/09 9:29,39.53306,-77.315 1/11/09 11:33,Product1,1200,Visa,Stefan,Stavanger,Rogaland,Norway,1/11/09 9:02,1/12/09 10:37,58.9666667,5.75 1/7/09 20:22,Product1,1200,Visa,Gina,Red Deer,Alberta,Canada,11/23/08 19:30,1/12/09 12:24,52.2666667,-113.8 1/2/09 22:00,Product1,1200,Diners,Lynne,Memphis ,TN,United States,1/2/09 21:04,1/12/09 13:18,35.14944,-90.04889 1/5/09 13:52,Product1,1200,Mastercard,Tammy,Morges,Vaud,Switzerland,1/5/09 5:55,1/12/09 14:04,46.5166667,6.5 1/8/09 20:32,Product1,1200,Visa,Kim,Calgary,Alberta,Canada,1/8/09 20:21,1/12/09 14:07,51.0833333,-114.0833333 1/8/09 13:34,Product1,1200,Visa,Bruce,Belleville,Ontario,Canada,1/6/09 14:38,1/12/09 18:31,44.1666667,-77.3833333 1/11/09 13:08,Product1,1200,Visa,Rosa Maria,Cincinnati ,OH,United States,1/11/09 12:38,1/12/09 18:44,39.16194,-84.45694 1/12/09 19:04,Product1,1200,Visa,Lydia,Comox,British Columbia,Canada,9/20/08 20:53,1/12/09 19:01,49.6833333,-124.9333333 1/12/09 13:41,Product1,1200,Visa,Eric,Gasperich,Luxembourg,Luxembourg,1/12/09 13:16,1/13/09 1:03,49.5855556,6.1230556 1/11/09 10:38,Product1,1200,Mastercard,AnaPaula,Helens Bay,Northern Ireland,United Kingdom,9/4/08 9:26,1/13/09 2:36,54.65,-5.7333333 1/13/09 5:57,Product1,1200,Visa,Robin,Milan,Lombardy,Italy,10/15/08 5:31,1/13/09 5:55,45.4666667,9.2 1/13/09 6:13,Product1,1200,Visa,Gitte,Staten Island ,NY,United States,1/13/09 5:17,1/13/09 7:33,40.63667,-74.15917 1/8/09 13:14,Product1,1200,Visa,Dr. Claudia,Oslo,Oslo,Norway,1/8/09 12:47,1/13/09 10:49,59.9166667,10.75 1/2/09 11:41,Product1,1200,Visa,Crystal,Farmington,Michigan,United States,1/1/09 12:00,1/13/09 18:34,42.46444,-83.37639 1/7/09 19:50,Product1,1200,Diners,Delphine,Santa Monica ,CA,United States,1/3/09 12:04,1/13/09 20:17,34.01944,-118.49028 1/1/09 20:28,Product1,1200,Visa,nathalie,Calgary,Alberta,Canada,1/1/09 20:11,1/13/09 21:11,51.0833333,-114.0833333 1/3/09 15:22,Product1,1200,Mastercard,Lindi,Vancouver,British Columbia,Canada,2/20/08 22:45,1/13/09 23:02,49.25,-123.1333333 1/12/09 3:03,Product2,3600,Mastercard,Valda,Irvine ,CA,United States,1/12/09 2:48,1/14/09 1:07,33.66944,-117.82222 1/5/09 8:58,Product2,3600,Mastercard,Marcia,Telgte,Nordrhein-Westfalen,Germany,9/1/08 3:39,1/14/09 2:07,52.3333333,7.9 1/10/09 14:03,Product1,1200,Mastercard,Kevin,Cheltenham,England,United Kingdom,3/13/06 4:56,1/14/09 2:22,51.9,-2.0833333 1/13/09 11:26,Product1,1200,Visa,Clare,Keller ,VA,United States,1/13/09 11:15,1/14/09 2:39,37.61917,-75.76417 1/2/09 12:18,Product1,1200,Visa,Alice,Nakskov,Storstrom,Denmark,12/5/07 11:37,1/14/09 4:05,54.8333333,11.15 1/14/09 4:54,Product1,1200,Mastercard,ZENA,Honolulu ,HI,United States,1/14/09 4:34,1/14/09 4:43,21.30694,-157.85833 1/6/09 17:15,Product1,1200,Visa,Andrea,Bubuieci,Chisinau,Moldova,12/24/08 17:31,1/14/09 10:27,46.985,28.9425 1/3/09 13:56,Product1,1200,Visa,Rennae,Amelia Island ,FL,United States,1/3/09 12:30,1/14/09 13:03,30.66944,-81.46278 1/4/09 7:54,Product1,1200,Visa,Gerhard,Alliston,Ontario,Canada,10/21/05 21:49,1/14/09 13:06,44.15,-79.8666667 1/12/09 7:28,Product1,1200,Amex,Megan,La Alberca,Murcia,Spain,12/10/08 16:41,1/14/09 13:44,37.9333333,-1.1333333 1/6/09 15:15,Product1,1200,Mastercard,Danielle,Rathgar,Dublin,Ireland,1/6/09 14:59,1/14/09 14:33,53.3122222,-6.2683333 1/13/09 23:56,Product1,1200,Mastercard,Tod,Coral Gables ,FL,United States,1/13/09 23:13,1/14/09 15:17,25.72111,-80.26861 1/14/09 19:32,Product1,1200,Visa,Janaina,Miami ,FL,United States,12/16/08 22:19,1/14/09 19:28,25.77389,-80.19389 1/6/09 21:13,Product1,1200,Visa,Kofi,Vancouver,British Columbia,Canada,1/7/08 21:16,1/14/09 20:50,49.25,-123.1333333 1/14/09 11:19,Product1,1200,Visa,Jennifer,Jumeira,Dubayy,United Arab Emirates,1/14/09 10:44,1/14/09 21:26,25.2097222,55.2477778 1/13/09 19:39,Product1,1200,Visa,Jolene ,Englewood ,CO,United States,1/6/09 22:00,1/14/09 22:02,39.64778,-104.98722 1/8/09 7:26,Product1,1200,Mastercard,anne,Bournemouth,England,United Kingdom,1/25/08 15:46,1/15/09 1:36,50.7166667,-1.8833333 1/15/09 2:40,Product1,1200,Mastercard,Alexis,Genoa ,IL,United States,1/15/09 2:04,1/15/09 2:04,42.09722,-88.69278 1/12/09 6:40,Product1,1200,Visa,Dez,Al 'Adliyah,Al Manamah,Bahrain,1/10/09 12:50,1/15/09 4:46,26.2172222,50.5405556 1/15/09 3:43,Product1,1200,Visa,Stephanie,Rouen,Upper Normandy,France,12/26/08 9:01,1/15/09 5:39,49.4333333,1.0833333 1/5/09 15:39,Product1,1200,Visa,Melissa ,Parkland ,FL,United States,12/10/08 9:14,1/15/09 6:01,26.30972,-80.2375 1/10/09 5:21,Product1,1200,Amex,CLARE,San Francisco ,CA,United States,1/10/09 0:07,1/15/09 6:25,37.775,-122.41833 1/15/09 4:12,Product1,1200,Mastercard,catherine,Keller ,VA,United States,1/15/09 4:02,1/15/09 6:59,37.61917,-75.76417 1/12/09 11:48,Product1,1200,Visa,Veronique ,Tsawwassen,British Columbia,Canada,7/24/08 15:48,1/15/09 8:56,49.0166667,-123.0833333 1/6/09 10:48,Product1,1200,Mastercard,Bruce and Camille,Clinton ,NJ,United States,8/21/07 21:19,1/15/09 9:32,40.63667,-74.91028 1/14/09 9:10,Product1,1200,Mastercard,Ellen,Owensboro ,KY,United States,1/14/09 8:25,1/15/09 9:40,37.77417,-87.11333 1/14/09 22:44,Product1,1200,Visa,Amy,Lakewood Village ,TX,United States,1/14/09 22:21,1/15/09 9:50,33.1425,-96.96917 1/6/09 7:23,Product1,1200,Visa,Anna,Okotoks,Alberta,Canada,7/21/08 12:03,1/15/09 10:00,50.7166667,-113.9666667 1/1/09 5:04,Product1,1200,Mastercard,Regina,Glimmen,Groningen,Netherlands,12/16/02 4:09,1/15/09 10:50,53.1333333,6.6333333 1/15/09 11:56,Product1,1200,Visa,Heidi,Calgary,Alberta,Canada,1/14/09 9:16,1/15/09 11:39,51.0833333,-114.0833333 1/15/09 11:58,Product1,1200,Visa,Jessica,Kanata,Ontario,Canada,1/14/09 5:59,1/15/09 11:49,45.3333333,-75.9 1/12/09 9:43,Product1,1200,Diners,Petra,Bergen,Nordrhein-Westfalen,Germany,1/7/09 8:39,1/15/09 12:14,51.7166667,6.5 1/15/09 12:33,Product1,1200,Visa,Brian,College Park ,MD,United States,1/15/09 12:19,1/15/09 13:28,38.98056,-76.93722 1/14/09 11:35,Product1,1200,Visa,Kenny,Kailua Kona ,HI,United States,1/13/09 17:42,1/15/09 15:31,19.7349,-155.9003 1/14/09 15:40,Product1,1200,Amex,ayse,Redondo Beach ,CA,United States,1/13/09 19:37,1/15/09 15:45,33.84917,-118.3875 1/3/09 11:08,Product1,1200,Amex,Maria and Timothy,Fountain Hls ,AZ,United States,6/5/06 22:42,1/15/09 16:37,33.61167,-111.71667 1/12/09 1:37,Product1,1200,Visa,IMAN,Brisbane,Queensland,Australia,1/12/09 1:26,1/15/09 17:54,-27.5,153.0166667 1/16/09 7:21,Product1,2100,Mastercard,Gerald,Mahopac ,NY,United States,11/3/08 14:28,1/16/09 6:08,41.37222,-73.73389 1/15/09 12:54,Product1,1200,Mastercard,Annelies,Ile-Perrot,Quebec,Canada,1/15/09 12:22,1/16/09 7:53,45.4,-73.9333333 1/7/09 7:19,Product1,1200,Amex,Jocelyn,Bruxelles,Brussels (Bruxelles),Belgium,6/30/08 9:33,1/16/09 8:54,50.8333333,4.3333333 1/3/09 9:56,Product1,1200,Visa,Kara,Chicago ,IL,United States,12/31/08 16:26,1/16/09 13:43,41.85,-87.65 1/16/09 17:41,Product1,1200,Visa,Orsi,Rayford ,TX,United States,1/16/09 17:01,1/16/09 17:56,30.07972,-95.41694 1/5/09 5:33,Product1,1200,Visa,Ben,Escondido ,CA,United States,1/5/09 3:19,1/17/09 0:35,33.11917,-117.08556 1/2/09 0:50,Product1,1200,Visa,Sam,Tesvikiye,Istanbul,Turkey,1/2/09 0:10,1/17/09 1:57,40.6166667,29.0666667 1/13/09 1:51,Product1,1200,Visa,Filip and Teresa,Centurion,Gauteng,South Africa,1/12/09 1:40,1/17/09 2:23,-25.8744444,28.1705556 1/15/09 10:24,Product1,1200,Visa,Grace ,York,England,United Kingdom,1/13/09 12:30,1/17/09 4:42,53.9666667,-1.0833333 1/11/09 8:59,Product1,1200,Visa,Chelsey ,Ashburn ,VA,United States,11/9/08 5:53,1/17/09 8:54,39.04361,-77.48778 1/15/09 15:56,Product1,1200,Amex,Charis,Los Angeles ,CA,United States,11/11/05 11:49,1/17/09 10:54,34.05222,-118.24278 1/1/09 12:19,Product1,1200,Visa,Marlene,Edgewood ,WA,United States,1/16/06 14:45,1/17/09 11:38,47.25028,-122.2925 1/6/09 14:03,Product1,1200,Visa,Fie,New York ,NY,United States,5/1/08 8:26,1/17/09 11:44,40.71417,-74.00639 1/9/09 15:32,Product1,1200,Diners,Nicole ,Basingstoke,England,United Kingdom,1/7/09 12:31,1/17/09 12:03,51.2666667,-1.0833333 1/17/09 12:59,Product1,1200,Diners,Linda,Den Haag,Zuid-Holland,Netherlands,10/29/08 13:09,1/17/09 13:07,52.0833333,4.3 1/12/09 12:37,Product1,1200,Visa,Janet,Marietta ,GA,United States,9/13/07 14:20,1/17/09 16:17,33.9525,-84.55 1/4/09 7:43,Product1,1200,Mastercard,Jamie,Houston ,TX,United States,1/4/09 6:51,1/17/09 17:31,29.76306,-95.36306 1/17/09 16:22,Product1,1200,Visa,Chad,West Orange ,NJ,United States,1/17/09 15:22,1/17/09 18:42,40.79861,-74.23944 1/1/09 3:51,Product1,1200,Mastercard,sunny,Amsterdam,Noord-Holland,Netherlands,9/14/05 22:53,1/17/09 22:34,52.35,4.9166667 1/18/09 5:27,Product1,1200,Visa,Anna,Downey ,CA,United States,1/18/09 4:28,1/18/09 4:42,33.94,-118.13167 1/18/09 5:15,Product1,1200,Diners,Roger,Urlingford,Kilkenny,Ireland,1/18/09 4:44,1/18/09 4:44,52.7205556,-7.5825 1/1/09 1:51,Product1,1200,Mastercard,Si,Holte,Kobenhavn,Denmark,12/14/05 15:46,1/18/09 4:44,55.8166667,12.4666667 1/18/09 6:30,Product1,1200,Visa,Sherri,Freienbach,Schwyz,Switzerland,6/22/08 14:10,1/18/09 6:21,47.2,8.75 1/11/09 10:51,Product1,1200,Mastercard,Katherine,Hofheim am Taunus,Hessen,Germany,12/6/08 1:34,1/18/09 7:17,50.0833333,8.45 1/4/09 17:02,Product1,1200,Mastercard,Clare,Lafayette ,CA,United States,12/31/05 0:55,1/18/09 8:43,37.88583,-122.11694 1/17/09 1:23,Product1,1200,Amex,Campbell,Mushrif,,Kuwait,1/16/09 14:26,1/18/09 9:08,29.2891667,48.05 1/18/09 2:16,Product1,1200,Visa,Ruth,Nashville ,AR,United States,1/16/09 19:32,1/18/09 9:13,33.94556,-93.84694 1/18/09 11:34,Product2,3600,Visa,Cheryl,New Malden,England,United Kingdom,10/28/05 14:57,1/18/09 10:27,51.4166667,-0.25 1/18/09 4:38,Product1,1200,Visa,Doug,Bishop Auckland,England,United Kingdom,12/28/07 13:39,1/18/09 11:58,54.65,-1.6666667 1/18/09 13:26,Product3,7500,Mastercard,Julianne,Navan,Meath,Ireland,1/18/09 12:20,1/18/09 12:20,53.6527778,-6.6813889 1/18/09 11:53,Product1,1200,Visa,Shailesh,Joppa,MD,United States,1/18/09 0:00,1/18/09 12:23,39.43361,-76.35806 1/18/09 12:04,Product1,1200,Visa,Conrad,Joppa,MD,United States,1/18/09 0:00,1/18/09 12:23,39.43361,-76.35806 1/13/09 19:54,Product1,1200,Diners,Alison,Hampton ,NJ,United States,1/3/06 6:09,1/18/09 12:51,40.70694,-74.95639 1/5/09 21:06,Product1,1200,Mastercard,Tracy,Louisville ,KY,United States,1/5/09 16:27,1/18/09 13:58,38.25417,-85.75944 1/14/09 6:32,Product1,1200,Visa,Kate,Broadlands ,VA,United States,4/12/06 6:14,1/18/09 14:04,39.04361,-77.48778 1/4/09 23:48,Product1,1200,Diners,Sarka,Yellowknife,Northwest Territories,Canada,1/4/09 22:41,1/18/09 16:17,62.45,-114.35 1/18/09 16:32,Product2,3600,Visa,Therese,Los Angeles ,CA,United States,1/18/09 16:23,1/18/09 16:54,34.05222,-118.24278 1/18/09 17:04,Product2,3600,Visa,Abdul-L,New York ,NY,United States,1/18/09 16:58,1/18/09 16:58,40.71417,-74.00639 1/18/09 17:20,Product2,3600,Visa,heidi,Saint Paul ,MN,United States,1/18/09 17:16,1/18/09 17:16,44.94444,-93.09306 1/18/09 17:39,Product2,3600,Visa,jiyoung,New York ,NY,United States,1/18/09 17:34,1/18/09 17:34,40.71417,-74.00639 1/11/09 11:20,Product1,1200,Visa,Klara,Spring Lake Park ,MN,United States,12/31/08 19:48,1/18/09 17:43,45.10778,-93.23778 1/13/09 20:59,Product1,1200,Mastercard,Andrew,Winnipeg,Manitoba,Canada,1/13/09 16:44,1/18/09 19:17,49.8833333,-97.1666667 1/12/09 16:50,Product1,1200,Visa,Vicki and Bill,Seattle ,WA,United States,1/4/09 21:33,1/19/09 1:22,47.60639,-122.33083 1/12/09 15:12,Product1,1200,Mastercard,David,Deptford ,NJ,United States,1/12/09 14:07,1/19/09 3:47,39.83806,-75.15306 1/6/09 12:27,Product1,1200,Mastercard,Antonella,Amsterdam,Noord-Holland,Netherlands,1/6/09 12:04,1/19/09 4:59,52.35,4.9166667 1/9/09 18:52,Product1,1200,Visa,David,Alpharetta ,GA,United States,11/25/08 7:56,1/19/09 6:12,34.07528,-84.29417 1/18/09 23:17,Product1,1200,Visa,Greg,Washington ,DC,United States,1/18/09 15:18,1/19/09 6:13,38.895,-77.03667 1/7/09 8:21,Product1,1200,Visa,Jannik ,Holmenkollen,Oslo,Norway,1/3/09 11:06,1/19/09 6:54,59.9666667,10.6666667 1/3/09 9:54,Product1,1200,Visa,Sylvia,Zekeriyakoy,Istanbul,Turkey,12/29/08 10:38,1/19/09 7:37,41.1980556,29.0302778 1/5/09 19:37,Product1,1200,Amex,Bernadette,Washington ,DC,United States,11/7/07 9:49,1/19/09 7:42,38.895,-77.03667 1/4/09 12:49,Product1,1200,Diners,Denise,Montreal,Quebec,Canada,5/25/07 10:58,1/19/09 7:58,45.5,-73.5833333 1/8/09 11:55,Product2,3600,Visa,Caren,Braunschweig,Lower Saxony,Germany,1/3/09 12:39,1/19/09 8:31,52.2666667,10.5333333 1/14/09 18:21,Product1,1200,Visa,luciana,Athens ,GA,United States,9/25/05 6:25,1/19/09 11:21,33.96083,-83.37806 1/11/09 19:01,Product1,1200,Diners,Maja,Hoschton ,GA,United States,1/11/09 18:17,1/19/09 12:47,34.09639,-83.76139 1/14/09 5:20,Product2,3600,Visa,Kristen,Binningen,Basel-Country,Switzerland,1/12/09 13:31,1/19/09 13:07,47.5333333,7.5666667 1/15/09 8:07,Product1,1200,Visa,Kirstie,Royal Oak ,MI,United States,12/13/08 19:35,1/19/09 14:59,42.48944,-83.14472 1/15/09 8:10,Product1,1200,Visa,Scott ,Royal Oak ,MI,United States,12/13/08 19:35,1/19/09 14:59,42.48944,-83.14472 1/2/09 17:45,Product1,1200,Mastercard,Jammie,Belmont ,MA,United States,12/9/05 17:19,1/19/09 15:36,42.39583,-71.17917 1/19/09 16:10,Product1,1200,Mastercard,Frank,Old Greenwich ,CT,United States,1/19/09 15:31,1/19/09 16:00,41.02278,-73.56528 1/19/09 16:55,Product1,1200,Mastercard,scott,Coconut Grove ,FL,United States,1/19/09 16:18,1/19/09 16:18,25.71222,-80.25722 1/10/09 17:41,Product1,1200,Visa,Jiri,Vienna ,VA,United States,1/10/09 16:32,1/19/09 17:52,38.90111,-77.26556 1/18/09 13:49,Product2,3600,Visa,Bev,San Ramon ,CA,United States,1/11/09 12:00,1/19/09 18:07,37.78,-121.97694 1/15/09 5:47,Product1,1200,Visa,Dave and Amy,Norfolk ,VA,United States,1/15/09 0:21,1/19/09 22:48,36.84667,-76.28556 1/19/09 23:06,Product1,1200,Mastercard,Rebecca,Norfolk ,VA,United States,1/19/09 22:53,1/19/09 22:53,36.84667,-76.28556 1/19/09 11:12,Product1,1200,Visa,Melissa,Aberdeen,Scotland,United Kingdom,8/27/08 8:22,1/20/09 0:35,57.1333333,-2.1 1/4/09 1:38,Product1,1200,Amex,jeremy,Charlestown,New South Wales,Australia,7/15/08 21:04,1/20/09 1:08,-32.95,151.6666667 1/20/09 3:11,Product1,1200,Visa,Randy,Wigan,England,United Kingdom,1/20/09 3:02,1/20/09 3:06,53.5333333,-2.6166667 1/3/09 10:52,Product1,1200,Visa,Djeiny,Rockville ,MD,United States,4/18/05 9:27,1/20/09 6:47,39.01806,-77.20889 1/20/09 5:24,Product3 ,7500,Mastercard,Amanda,Shreveport ,LA,United States,1/20/09 5:13,1/20/09 7:15,32.525,-93.75 1/20/09 6:03,Product1,1200,Mastercard,Andrea ,Shreveport ,LA,United States,1/20/09 5:13,1/20/09 7:15,32.525,-93.75 1/10/09 11:37,Product1,1200,Amex,Joanna,Little Silver ,NJ,United States,12/28/08 20:10,1/20/09 7:42,40.33667,-74.0475 1/20/09 5:50,Product1,1200,Visa,Jessica,Abbey Town,England,United Kingdom,1/20/09 4:23,1/20/09 7:46,54.8333333,-3.2833333 1/19/09 16:32,Product1,1200,Amex,alison,Mid City West ,PA,United States,1/19/09 10:24,1/20/09 10:09,39.95222,-75.16417 1/18/09 10:42,Product1,1200,Visa,malin,Atlanta,Georgia,United States,1/18/09 0:00,1/20/09 11:09,33.74889,-84.38806 1/7/09 6:11,Product2,3600,Visa,Tiffany ,Paris,Ile-de-France,France,1/7/09 5:30,1/20/09 11:22,48.8666667,2.3333333 1/3/09 8:29,Product1,1200,Visa,Genevieve,Milton Keynes,England,United Kingdom,10/10/08 1:26,1/20/09 11:31,52.0333333,-0.7 1/1/09 2:09,Product1,1200,Mastercard,Saraya,Dresden,Saxony,Germany,3/12/06 11:31,1/20/09 11:56,51.05,13.75 1/20/09 12:34,Product1,1200,Mastercard,Anastasia,NYC ,NY,United States,1/20/09 12:17,1/20/09 12:55,40.71417,-74.00639 1/20/09 3:51,Product1,1200,Visa,Elizabeth,The Grange,Queensland,Australia,11/12/08 3:34,1/20/09 13:11,-24.8166667,152.4166667 1/15/09 11:26,Product1,1200,Visa,Nicole,Brookline ,MA,United States,7/11/07 11:18,1/20/09 14:01,42.33167,-71.12167 1/5/09 16:55,Product1,1200,Visa,Jeffrey,Montreal-Nord,Quebec,Canada,9/29/03 17:08,1/20/09 14:38,45.6,-73.6166667 1/12/09 19:47,Product1,1200,Mastercard,Blanca Gabriela ,Irving ,TX,United States,12/10/08 21:49,1/20/09 18:02,32.81389,-96.94861 1/4/09 19:20,Product1,1200,Amex,Elisa,Ottawa Hills ,OH,United States,1/4/09 18:38,1/20/09 18:03,41.66417,-83.64333 1/10/09 8:33,Product2,3600,Mastercard,Patricia ,Portola Valley ,CA,United States,2/4/07 10:09,1/20/09 22:06,37.38417,-122.23417 1/9/09 14:51,Product1,1200,Visa,Bob,Sydney,New South Wales,Australia,1/7/09 18:15,1/21/09 0:29,-33.8833333,151.2166667 1/16/09 2:41,Product3,7500,Visa,Kristyn,Kearns ,UT,United States,1/15/09 18:01,1/21/09 1:02,40.66,-111.99556 1/16/09 18:36,Product1,1200,Visa,Elizabeth,Wollongong,New South Wales,Australia,11/1/08 16:32,1/21/09 1:49,-34.4333333,150.8833333 1/20/09 8:10,Product1,1200,Amex,Cathy,Brooklyn ,NY,United States,8/5/07 18:52,1/21/09 5:16,40.65,-73.95 1/6/09 12:45,Product2,3600,Amex,Kaylee,Penngrove ,CA,United States,1/5/09 14:06,1/21/09 11:18,38.29972,-122.66556 1/10/09 8:13,Product1,1200,Visa,suzanne,Lemont ,IL,United States,1/9/09 19:15,1/21/09 11:35,41.67361,-88.00167 1/7/09 14:15,Product1,1200,Mastercard,Cassandra,San Carlos ,CA,United States,1/5/09 15:42,1/21/09 12:00,37.50722,-122.25944 1/8/09 15:27,Product1,1200,Mastercard,Jennifer,Chicago ,IL,United States,1/4/09 22:22,1/21/09 13:28,41.85,-87.65 1/21/09 11:36,Product1,1200,Visa,nicole,Oslo,Oslo,Norway,12/23/08 12:02,1/21/09 13:47,59.9166667,10.75 1/21/09 14:06,Product1,1200,Visa,Sean,Wantagh,NY,United States,1/21/09 12:00,1/21/09 14:06,40.68361,-73.51056 1/2/09 2:28,Product1,1200,Mastercard,Morgan,Coomera,Queensland,Australia,5/3/08 4:14,1/21/09 16:37,-27.8833333,153.3 1/19/09 19:07,Product1,1200,Diners,Harriet,Fort Oglethorpe ,GA,United States,1/19/09 16:52,1/21/09 17:02,34.94889,-85.25694 1/18/09 6:27,Product1,1200,Mastercard,Janine,Corbin City ,NJ,United States,10/27/05 19:22,1/21/09 17:10,39.24167,-74.81556 1/20/09 11:58,Product1,1200,Mastercard,Debora,Lakeside ,CA,United States,11/1/08 23:14,1/21/09 17:25,32.85722,-116.92139 1/20/09 16:32,Product1,1200,Visa,Vishpala,Margate ,FL,United States,1/2/08 9:52,1/21/09 19:05,26.30972,-80.2375 1/1/09 7:09,Product1,1200,Amex,Emer,South Palm Beach ,FL,United States,2/28/05 5:40,1/21/09 19:14,26.70528,-80.03667 1/21/09 14:55,Product1,1200,Diners,john,New York ,NY,United States,1/21/09 10:23,1/21/09 20:34,40.71417,-74.00639 1/7/09 22:29,Product1,1200,Mastercard,lailani,Anchorage ,AK,United States,1/7/09 13:23,1/21/09 22:30,61.21806,-149.90028 1/11/09 22:22,Product2,3600,Visa,STEPHANIE,Mona Vale,New South Wales,Australia,12/30/08 17:48,1/21/09 22:33,-33.6666667,151.3 1/21/09 14:25,Product1,1200,Visa,Tricia,Castricum,Noord-Holland,Netherlands,12/28/07 15:28,1/22/09 0:38,52.55,4.6666667 1/18/09 16:50,Product1,1200,Visa,Celina,North Brunswick ,NJ,United States,1/18/09 16:25,1/22/09 1:17,40.4497,-74.482 1/21/09 12:08,Product2,3600,Visa,Rosemary,Jacksonville ,FL,United States,1/21/09 11:39,1/22/09 6:13,30.33194,-81.65583 1/22/09 6:41,Product1,1200,Visa,Patrick,Baytown ,TX,United States,1/22/09 4:32,1/22/09 6:54,29.73528,-94.97722 1/12/09 9:23,Product1,1200,Mastercard,Jacob,Winter Haven ,FL,United States,1/10/09 14:55,1/22/09 7:59,28.02194,-81.73306 1/22/09 8:23,Product1,1200,Visa,elisabeth,Gonzaga Univ ,WA,United States,1/22/09 7:55,1/22/09 8:14,47.65889,-117.425 1/3/09 6:41,Product2,3600,Visa,ayelet,Malmo,Skane,Sweden,8/7/08 9:24,1/22/09 11:24,55.6,13 1/1/09 12:20,Product2,3600,Visa,seemab,San Pawl tat-Targa, ,Malta,9/17/05 3:32,1/22/09 12:00,35.9202778,14.4425 1/4/09 22:00,Product2,3600,Amex,Lucien,Wiesbaden,Hessen,Germany,1/4/09 11:32,1/22/09 12:21,50.0833333,8.25 1/21/09 2:15,Product1,1200,Visa,Kevin ,London,England,United Kingdom,1/8/09 2:50,1/22/09 13:46,51.52721,0.14559 1/1/09 14:22,Product1,1200,Mastercard,Liban,Stavanger,Rogaland,Norway,6/19/08 10:48,1/22/09 14:38,58.9666667,5.75 1/16/09 1:07,Product2,3600,Diners,Lesley,Cork,Cork,Ireland,1/14/09 4:10,1/22/09 15:06,51.8986111,-8.4958333 1/20/09 8:51,Product1,1200,Visa,Marie,Winchester ,MA,United States,7/23/08 14:59,1/22/09 18:08,42.45222,-71.1375 1/4/09 9:02,Product1,1200,Visa,Charlene,Calgary,Alberta,Canada,12/13/08 19:20,1/22/09 19:27,51.0833333,-114.0833333 1/6/09 8:34,Product1,1200,Visa,Orit,Dallas ,TX,United States,1/5/09 15:00,1/22/09 21:41,32.78333,-96.8 1/8/09 4:16,Product1,1200,Visa,Alan,Malahide,Dublin,Ireland,4/18/06 13:26,1/23/09 2:21,53.4508333,-6.1544444 1/23/09 3:33,Product2,3600,Mastercard,Anja Langer,Saint Paul ,MN,United States,1/23/09 3:00,1/23/09 3:00,44.94444,-93.09306 1/6/09 4:18,Product1,1200,Visa,Lina,Edinburgh,Scotland,United Kingdom,1/6/09 3:38,1/23/09 3:22,55.95,-3.2 1/23/09 3:30,Product1,1200,Amex,Larry,Naarden,Noord-Holland,Netherlands,1/23/09 3:27,1/23/09 3:40,52.3,5.15 1/10/09 4:04,Product1,1200,Visa,Jessica,Oldenburg,Lower Saxony,Germany,12/20/08 8:41,1/23/09 5:28,53.1666667,8.2 1/5/09 2:57,Product3,7500,Visa,Marion,Rennes,Brittany,France,12/29/08 3:16,1/23/09 7:29,48.0833333,-1.6833333 1/21/09 14:15,Product1,1200,Amex,Eric,Ely ,NV,United States,1/21/09 13:56,1/23/09 10:35,39.2475,-114.88778 1/21/09 6:39,Product1,1200,Amex,Miriane,Norfolk ,VA,United States,7/30/07 21:10,1/23/09 12:48,36.84667,-76.28556 1/19/09 8:14,Product1,1200,Visa,Jeff,Houston ,TX,United States,1/4/09 12:39,1/23/09 12:52,29.76306,-95.36306 1/23/09 8:00,Product1,1200,Diners,christina,Chepel,Budapest,Hungary,1/22/09 9:55,1/23/09 12:59,47.4166667,19.0833333 1/22/09 23:35,Product1,1200,Mastercard,Shannon,Buffalo Grove ,IL,United States,1/22/09 23:23,1/23/09 22:05,41.98111,-89.595 1/14/09 3:09,Product1,1200,Mastercard,Angela,Newburgh,Scotland,United Kingdom,4/25/07 5:08,1/24/09 2:12,56.3333333,-3.25 1/16/09 1:51,Product1,1200,Visa,Angela,Vienna,Vienna,Austria,1/16/09 1:38,1/24/09 5:39,48.2,16.3666667 1/1/09 6:29,Product1,1200,Mastercard,Elaine,Vicenza,Veneto,Italy,8/3/07 2:48,1/24/09 5:51,45.55,11.55 1/21/09 7:59,Product1,1200,Visa,Helen,Mechanics Grove ,PA,United States,4/7/08 17:15,1/24/09 6:01,39.89694,-76.16389 1/23/09 7:37,Product2,3600,Amex,Fatisha,Miami ,FL,United States,1/23/09 6:32,1/24/09 6:54,25.77389,-80.19389 1/18/09 14:39,Product1,1200,Visa,Nina,Silver Spring ,MD,United States,1/5/09 15:43,1/24/09 7:31,38.99056,-77.02639 1/24/09 9:01,Product2,3600,Visa,Barbara,Kirriemuir,Scotland,United Kingdom,1/24/09 8:02,1/24/09 8:02,56.6666667,-3 1/15/09 1:41,Product1,1200,Diners,Karen,Roquefort,Provence-Alpes-Cote d'Azur,France,1/14/09 4:13,1/24/09 8:36,43.25,5.6166667 1/17/09 7:23,Product1,1200,Visa,Georgina,Portland ,OR,United States,11/28/07 10:05,1/24/09 8:54,45.52361,-122.675 1/23/09 11:37,Product1,1200,Diners,Kellie,Staten Island ,NY,United States,1/23/09 10:42,1/24/09 8:59,40.56472,-74.1275 1/19/09 15:02,Product1,1200,Mastercard,Terry,San Antonio ,TX,United States,1/19/09 14:43,1/24/09 10:26,29.42389,-98.49333 1/11/09 7:10,Product2,3600,Visa,LAURIE,Guildford,England,United Kingdom,3/7/06 5:47,1/24/09 14:54,51.2166667,-0.5666667 1/10/09 3:28,Product1,1200,Visa,frauke,Horten,Vestfold,Norway,11/24/08 15:50,1/24/09 15:10,59.4136111,10.4669444 1/7/09 19:03,Product2,3600,Mastercard,Cindy,Englewood ,CO,United States,12/17/07 19:55,1/24/09 19:19,39.64778,-104.98722 1/17/09 14:02,Product1,1200,Visa,Simone,San Antonio ,TX,United States,12/7/05 19:48,1/24/09 21:29,29.42389,-98.49333 1/25/09 0:09,Product1,1200,Visa,Hilde ,Princeville ,HI,United States,6/20/08 22:08,1/25/09 0:12,22.22361,-159.48528 1/9/09 14:27,Product1,1200,Visa,Leah,Castleknock,Dublin,Ireland,6/14/07 13:14,1/25/09 0:57,53.3786111,-6.3922222 1/9/09 14:32,Product1,1200,Visa,Laine,Castleknock,Dublin,Ireland,6/14/07 13:14,1/25/09 0:57,53.3786111,-6.3922222 1/11/09 15:59,Product1,1200,Visa,kirsten,Bishops Stortford,England,United Kingdom,1/17/06 8:51,1/25/09 3:03,51.8666667,0.1666667 1/6/09 14:38,Product2,3600,Mastercard,Elizabeth,Den Haag,Zuid-Holland,Netherlands,5/14/07 12:48,1/25/09 3:13,52.0833333,4.3 1/6/09 9:52,Product1,1200,Mastercard,Anna,Lafayette ,CA,United States,1/3/09 15:01,1/25/09 10:19,37.88583,-122.11694 1/1/09 9:21,Product1,1200,Diners,Babs,Blackpool,England,United Kingdom,1/1/09 8:05,1/25/09 10:52,53.8166667,-3.05 1/3/09 7:58,Product1,1200,Mastercard,Gerlinde,Hellerup,Kobenhavn,Denmark,1/2/09 12:27,1/25/09 11:13,55.7333333,12.5833333 1/11/09 11:36,Product1,1200,Mastercard,Hollyn,London,England,United Kingdom,10/14/08 14:23,1/25/09 11:16,51.51334,-0.08895 1/13/09 14:53,Product1,1200,Visa,leiser,N Java ,NY,United States,1/13/09 13:22,1/25/09 11:33,42.68361,-78.33806 1/1/09 10:06,Product2,3600,Mastercard,Irene,Munich,Bayern,Germany,1/1/09 9:13,1/25/09 11:37,48.15,11.5833333 1/16/09 5:07,Product1,1200,Amex,Lisa,Brulon,Pays de la Loire,France,8/6/07 7:48,1/25/09 11:42,47.9666667,-0.2333333 1/6/09 16:37,Product1,1200,Visa,Ann,Austin ,TX,United States,12/28/08 12:31,1/25/09 12:17,30.26694,-97.74278 1/18/09 17:21,Product1,1200,Mastercard,Nichol Jane,Midland Park ,NJ,United States,1/11/09 20:59,1/25/09 14:00,40.98917,-74.14111 1/13/09 15:18,Product1,1200,Amex,Beatriz,Centerport ,NY,United States,1/13/09 14:46,1/25/09 14:01,40.88528,-73.37667 1/24/09 8:21,Product1,1200,Mastercard,corina,Neustift am Walde,Vienna,Austria,7/19/05 12:42,1/25/09 14:22,48.25,16.3 1/24/09 8:25,Product1,1200,Mastercard,manon,Neustift am Walde,Vienna,Austria,7/19/05 12:42,1/25/09 14:22,48.25,16.3 1/18/09 13:06,Product1,1200,Diners,Isabelle,Shorewood ,MN,United States,1/18/09 8:44,1/25/09 14:49,44.90333,-93.56611 1/22/09 18:44,Product1,1200,Visa,Lynne,Southlake ,TX,United States,1/22/09 17:24,1/25/09 15:02,32.94111,-97.13389 1/8/09 8:58,Product1,1200,Mastercard,Doug,Huntington ,NY,United States,1/8/09 8:22,1/25/09 17:39,40.86806,-73.42611 1/4/09 9:54,Product1,1200,Mastercard,AMY,The Woodlands ,TX,United States,12/30/08 20:41,1/25/09 18:23,30.15778,-95.48917 1/13/09 20:22,Product1,1200,Visa,Kim,Kelowna,British Columbia,Canada,8/2/08 14:28,1/25/09 19:25,49.9,-119.4833333 1/9/09 10:22,Product1,1200,Mastercard,HELIDA,White House ,TN,United States,1/5/09 14:49,1/25/09 19:35,36.47028,-86.65139 1/5/09 12:28,Product1,1200,Visa,Cameron,Rungsted,Frederiksborg,Denmark,1/5/09 12:02,1/25/09 23:22,55.8841667,12.5419444 1/26/09 3:43,Product1,1200,Mastercard,Wendy,Lake Mahopac ,NY,United States,1/26/09 3:10,1/26/09 3:10,41.37222,-73.73389 1/26/09 3:49,Product2,3600,Mastercard,Jane,Biot,Provence-Alpes-Cote d'Azur,France,3/1/08 0:00,1/26/09 3:18,43.6333333,7.1 1/11/09 13:16,Product2,3600,Visa,shelby,Plantation ,FL,United States,1/11/09 12:20,1/26/09 3:42,26.12194,-80.14361 1/22/09 15:32,Product1,1200,Mastercard,Tara,Killiney,Dublin,Ireland,2/27/07 11:35,1/26/09 4:32,53.2522222,-6.1125 1/9/09 14:25,Product1,1200,Amex,James,Guer,Brittany,France,4/7/08 0:00,1/26/09 5:32,47.9,-2.1166667 1/21/09 11:28,Product1,800,Amex,Heloise ,Arlington ,VA,United States,9/25/05 20:26,1/26/09 6:23,38.89028,-77.08444 1/1/09 14:19,Product1,1200,Mastercard,Gabriel,Three Hills,Alberta,Canada,5/21/08 11:39,1/26/09 7:17,51.7,-113.2666667 1/26/09 4:30,Product1,1200,Visa,Jodie ,Great Falls,Virginia,United States,1/26/09 0:00,1/26/09 7:48,38.99806,-77.28861 1/7/09 4:45,Product1,1200,Amex,Jeremy,London,England,United Kingdom,1/7/09 4:30,1/26/09 8:01,51.52721,0.14559 1/11/09 12:12,Product1,1200,Visa,Helga,Clontarf,Dublin,Ireland,11/30/05 12:50,1/26/09 10:00,53.3591667,-6.2161111 1/26/09 10:24,Product1,1200,Visa,Eleanor,Vancouver,British Columbia,Canada,12/1/08 18:30,1/26/09 10:12,49.25,-123.1333333 1/26/09 8:58,Product1,1200,Diners,Miss,London,England,United Kingdom,1/26/09 8:46,1/26/09 11:14,51.52721,0.14559 1/7/09 17:51,Product1,1200,Visa,Marie,Dickerson ,MD,United States,1/13/06 9:38,1/26/09 11:35,39.22,-77.42444 1/18/09 20:16,Product1,1200,Mastercard,Lisa,Princeton ,NJ,United States,1/18/09 19:47,1/26/09 13:07,40.34861,-74.65944 1/13/09 9:51,Product1,1200,Mastercard,Priska,Calgary,Alberta,Canada,1/4/09 23:43,1/26/09 17:24,51.0833333,-114.0833333 1/24/09 18:43,Product1,1200,Visa,Katrine,North Tustin ,CA,United States,1/11/09 13:33,1/26/09 21:29,33.76444,-117.79306 1/5/09 0:46,Product1,1200,Amex,Lisa,Gurgaon,Haryana,India,1/2/09 3:03,1/27/09 0:17,28.4666667,77.0333333 1/9/09 1:12,Product1,1200,Visa,Sabrina,Rambouillet,Ile-de-France,France,6/18/08 6:35,1/27/09 2:56,48.65,1.8333333 1/26/09 6:25,Product1,1200,Visa,prof,Gladwyne ,PA,United States,1/19/09 6:38,1/27/09 3:58,40.04056,-75.27944 1/21/09 16:57,Product1,1200,Mastercard,KeithMichelle,Houston ,TX,United States,1/21/09 16:37,1/27/09 4:43,29.76306,-95.36306 1/5/09 5:33,Product1,1200,Mastercard,Kim,London,England,United Kingdom,12/8/05 13:22,1/27/09 4:49,51.52721,0.14559 1/27/09 5:10,Product1,1200,Visa,anissa,Slough,England,United Kingdom,1/15/09 10:07,1/27/09 4:51,51.5,-0.5833333 1/7/09 8:00,Product1,1200,Mastercard,john,Glan-Munchweiler,Rhineland-Palatinate,Germany,5/26/05 7:00,1/27/09 6:30,49.4666667,7.4333333 1/20/09 7:08,Product2,3600,Visa,Miye,Downingtown ,PA,United States,1/19/09 8:06,1/27/09 6:38,40.00639,-75.70361 1/27/09 2:26,Product1,1200,Diners,Heidi,MT Pleasant ,TX,United States,1/27/09 2:16,1/27/09 6:41,33.15667,-94.96806 1/5/09 6:14,Product1,1200,Mastercard,T,Veigy-Foncenex,Rhone-Alpes,France,1/5/09 4:52,1/27/09 7:01,46.2666667,6.25 1/13/09 8:11,Product2,3600,Visa,Daniele,Katy ,TX,United States,5/27/08 11:01,1/27/09 7:49,29.78556,-95.82417 1/10/09 9:18,Product1,1200,Diners,luisa,Gorey, ,Jersey,5/9/06 10:43,1/27/09 7:51,49.2,-2.0333333 1/8/09 18:52,Product1,1200,Visa,Nadine,Belgrade ,MT,United States,1/7/09 15:30,1/27/09 9:40,45.77611,-111.17611 1/12/09 10:06,Product1,1200,Mastercard,Tina,Calgary,Alberta,Canada,1/10/09 14:15,1/27/09 14:26,51.0833333,-114.0833333 1/1/09 19:25,Product1,1200,Diners,Damali,Toronto,Ontario,Canada,1/8/08 20:41,1/27/09 14:59,43.6666667,-79.4166667 1/27/09 15:28,Product1,1200,Visa,Katherine,Corrales ,NM,United States,1/17/09 17:52,1/27/09 15:17,35.23778,-106.60611 1/2/09 18:43,Product1,1200,Visa,Kathryn,Cork,Cork,Ireland,12/22/08 15:39,1/27/09 15:43,51.8986111,-8.4958333 1/8/09 18:41,Product1,1200,Diners,Veronique,Tenafly ,NJ,United States,12/9/07 17:59,1/27/09 18:12,40.92528,-73.96333 1/4/09 18:34,Product1,1200,Visa,Erica,Leesburg ,VA,United States,1/4/09 16:53,1/27/09 18:37,39.11556,-77.56389 1/25/09 8:32,Product1,1200,Visa,L,Alcona,Ontario,Canada,9/17/07 17:41,1/27/09 19:53,50.0666667,-91.75 1/23/09 22:19,Product1,1200,Mastercard,Diana,Kuala Lumpur,Kuala Lumpur,Malaysia,1/23/09 22:10,1/27/09 19:54,3.1666667,101.7 1/7/09 10:03,Product1,1200,Mastercard,Emma,Sydney,New South Wales,Australia,12/1/08 6:09,1/27/09 20:18,-33.8833333,151.2166667 1/18/09 3:46,Product1,1200,Visa,Marina,Nerang,Queensland,Australia,1/18/09 0:54,1/27/09 23:52,-27.9833333,153.3333333 1/28/09 0:40,Product1,1200,Mastercard,Natalie ,Bryceville ,FL,United States,1/27/09 22:04,1/28/09 0:01,30.38444,-81.93889 1/2/09 15:18,Product1,1200,Diners,Brenda,Saffron Walden,England,United Kingdom,9/1/04 2:08,1/28/09 1:26,52.0166667,0.25 1/18/09 13:59,Product1,1200,Diners,Nita,Sutton,Dublin,Ireland,12/1/05 19:57,1/28/09 4:07,53.3905556,-6.1216667 1/16/09 9:54,Product1,1200,Mastercard,Marian,Durban,KwaZulu-Natal,South Africa,8/3/08 18:20,1/28/09 6:26,-29.85,31.0166667 1/28/09 7:07,Product1,1200,Visa,Kevin,Berkeswell,England,United Kingdom,1/28/09 6:57,1/28/09 7:18,52.4,-1.6333333 1/28/09 7:31,Product1,1200,Visa,cari,Dryden ,VA,United States,1/28/09 7:22,1/28/09 7:34,36.7775,-82.94167 1/18/09 12:32,Product1,1200,Visa,Cassandra,Santry,Dublin,Ireland,12/14/08 14:26,1/28/09 7:41,53.3986111,-6.2597222 1/13/09 14:05,Product1,1200,Amex,Christof and Heidi,Barcelona,Catalonia,Spain,1/9/09 7:54,1/28/09 7:45,41.3833333,2.1833333 1/28/09 7:49,Product1,1200,Visa,Ina,Fayetteville ,NC,United States,1/28/09 7:45,1/28/09 7:47,35.0525,-78.87861 1/28/09 3:07,Product1,1200,Visa,Lisa,Anse Comeau,Quebec,Canada,1/26/09 11:47,1/28/09 8:08,49.2166667,-68.15 1/12/09 15:16,Product1,1200,Visa,Camille and Carmen,Thorlakshofn, ,Iceland,1/12/09 11:41,1/28/09 8:44,63.85,-21.3666667 1/6/09 11:17,Product2,3600,Visa,Trina,Overland ,KS,United States,2/21/08 8:53,1/28/09 9:23,38.98222,-94.67056 1/23/09 9:49,Product1,1200,Visa,Ginger,King City,Ontario,Canada,1/23/09 8:18,1/28/09 9:43,43.9333333,-79.5333333 1/24/09 4:01,Product1,1200,Visa,breon,Leighton Buzzard,England,United Kingdom,1/7/06 10:56,1/28/09 10:12,51.9166667,-0.65 1/25/09 18:21,Product1,1200,Visa,Marion,Umea,Vasterbotten,Sweden,1/25/09 16:35,1/28/09 10:19,63.8333333,20.25 1/15/09 10:51,Product1,1200,Mastercard,Pia ,Sola,Rogaland,Norway,1/11/09 8:54,1/28/09 10:39,58.8833333,5.6 1/2/09 5:14,Product1,1200,Visa,Dr. Donald,Stockton-on-Tees,England,United Kingdom,1/1/05 6:03,1/28/09 11:07,54.5833333,-1.4166667 1/9/09 10:35,Product2,3600,Visa,Jenna and Paul,Senatobia ,MS,United States,1/8/09 14:02,1/28/09 11:08,34.6175,-89.96861 1/4/09 10:16,Product1,1200,Mastercard,Rebecca,Berlin,Berlin,Germany,12/28/08 10:50,1/28/09 11:09,52.5166667,13.4 1/2/09 12:16,Product1,1200,Mastercard,Monique,Waldorf ,MD,United States,12/11/08 6:16,1/28/09 12:07,38.62444,-76.93944 1/28/09 12:31,Product1,1200,Diners,lilia ,Brooklyn ,NY,United States,1/28/09 12:21,1/28/09 12:30,40.65,-73.95 1/14/09 12:07,Product1,1200,Mastercard,Lainey,Lakeville ,MN,United States,1/13/09 22:28,1/28/09 12:37,44.64972,-93.2425 1/16/09 7:20,Product2,3600,Mastercard,Jag,Saint-Cergues,Rhone-Alpes,France,1/15/09 4:53,1/28/09 12:43,46.2333333,6.3166667 1/6/09 9:55,Product1,1200,Mastercard,Charlene ,Vancouver,British Columbia,Canada,10/7/08 14:55,1/28/09 13:17,49.25,-123.1333333 1/7/09 12:55,Product1,1200,Amex,Fiona,Stamford ,CT,United States,1/5/09 6:26,1/28/09 13:24,41.05333,-73.53917 1/19/09 12:14,Product1,1200,Mastercard,burt,Rathfarnham,Dublin,Ireland,5/10/08 7:07,1/28/09 13:28,53.3005556,-6.2827778 1/13/09 15:19,Product2,3600,Visa,Maggie,Paris,Ile-de-France,France,6/27/07 4:41,1/28/09 14:11,48.8666667,2.3333333 1/18/09 8:56,Product1,1200,Mastercard,Stanford,Howell ,MI,United States,1/30/08 13:16,1/28/09 14:37,42.60722,-83.92944 1/4/09 17:54,Product1,1200,Amex,ruth,Encinitas ,CA,United States,1/1/09 10:12,1/28/09 15:13,33.03694,-117.29111 1/5/09 13:46,Product1,1200,Visa,Courtney,Atchison ,KS,United States,11/11/08 14:19,1/28/09 17:10,39.56306,-95.12139 1/5/09 10:49,Product2,3600,Amex,Courtney,Mililani ,HI,United States,8/23/07 0:00,1/28/09 18:13,21.42556,-157.96083 1/12/09 18:24,Product1,1200,Diners,Anthony,Victor ,NY,United States,12/18/08 7:14,1/28/09 18:19,42.9825,-77.40917 1/18/09 4:01,Product1,1200,Visa,Eleanor,Fairbanks ,AK,United States,1/6/09 0:18,1/28/09 23:56,64.83778,-147.71639 1/16/09 10:58,Product1,1200,Visa,GAIA,Soro,Vestsjalland,Denmark,7/27/07 7:22,1/29/09 3:16,55.4333333,11.5666667 1/13/09 8:20,Product1,1200,Mastercard,Zane,Warlingham,England,United Kingdom,3/4/05 5:51,1/29/09 3:25,51.3,-0.05 1/12/09 1:42,Product1,1200,Mastercard,Beate,Hamburg,Hamburg,Germany,1/7/09 7:56,1/29/09 4:33,53.55,10 1/28/09 13:07,Product1,1200,Amex,BALA,Accokeek ,MD,United States,11/29/07 5:56,1/29/09 4:40,38.6675,-77.02861 1/29/09 5:43,Product1,1200,Visa,Mrs,Sunnyvale ,CA,United States,1/29/09 5:18,1/29/09 5:18,37.36889,-122.03528 1/29/09 5:30,Product1,1200,Diners,Vanessa,Ithaca ,NY,United States,1/29/09 4:49,1/29/09 6:56,42.44056,-76.49694 1/13/09 18:08,Product1,1200,Amex,Amanda,Houston ,TX,United States,1/13/09 17:02,1/29/09 7:34,29.76306,-95.36306 1/9/09 15:24,Product1,1200,Mastercard,alex ,Farmingtn Hls ,MI,United States,1/9/09 13:59,1/29/09 8:05,42.46444,-83.37639 1/23/09 15:33,Product1,1200,Mastercard,T,Brooklyn ,NY,United States,1/23/09 14:18,1/29/09 11:02,40.65,-73.95 1/29/09 12:28,Product1,1200,Mastercard,Alva and Martin,Great Falls ,VA,United States,5/21/07 14:57,1/29/09 12:31,38.99806,-77.28861 1/13/09 11:31,Product1,1200,Visa,Anett,Gosport,England,United Kingdom,1/9/09 11:30,1/29/09 12:48,50.8,-1.1333333 1/29/09 10:09,Product2,3600,Mastercard,Jacqui,Scottsdale ,AZ,United States,1/29/09 9:59,1/29/09 12:58,33.50917,-111.89833 1/29/09 15:08,Product1,1200,Visa,KERRY,Sunnyvale ,CA,United States,1/29/09 14:04,1/29/09 14:04,37.36889,-122.03528 1/4/09 5:12,Product1,1200,Visa,DeeDee,Songnae-dong,Soul-t'ukpyolsi,South Korea,12/30/08 8:40,1/29/09 16:41,37.5333333,127.1166667 1/22/09 22:16,Product2,3600,Mastercard,leanne,Clyde Hill ,WA,United States,1/17/09 23:28,1/29/09 16:51,47.61056,-122.19944 1/5/09 19:26,Product1,1200,Visa,katie,Ruschlikon,Zurich,Switzerland,1/5/09 19:14,1/30/09 1:06,47.3,8.55 1/11/09 12:22,Product1,1200,Visa,Marina,Minneapolis ,MN,United States,1/11/09 7:18,1/30/09 2:10,44.98,-93.26361 1/2/09 9:31,Product1,1200,Visa,camilla,Chicago ,IL,United States,1/2/09 9:09,1/30/09 5:35,41.85,-87.65 1/5/09 11:21,Product1,1200,Visa,pirunkit,Petworth,England,United Kingdom,1/5/09 5:46,1/30/09 5:54,50.9833333,-0.6 1/17/09 9:49,Product1,1200,Diners,Kathrin,Abu Dhabi,Abu Zaby,United Arab Emirates,2/27/08 20:02,1/30/09 8:45,24.4666667,54.3666667 1/28/09 1:38,Product1,1200,Mastercard,Kate,Stockholm,Stockholm,Sweden,4/16/07 12:58,1/30/09 9:18,59.3333333,18.05 1/19/09 10:32,Product1,1200,Mastercard,Maie,Queen Creek ,AZ,United States,1/6/09 17:57,1/30/09 10:41,33.24861,-111.63361 1/26/09 12:05,Product1,1250,Mastercard,verena,Queen Creek ,AZ,United States,1/6/09 17:57,1/30/09 10:41,33.24861,-111.63361 1/7/09 18:53,Product1,1200,Visa,Marie-Christine,Durham ,NC,United States,12/29/08 9:59,1/30/09 10:46,35.99389,-78.89889 1/26/09 11:38,Product1,1200,Mastercard,Gabriella,Austin ,TX,United States,1/26/09 7:16,1/30/09 13:15,30.26694,-97.74278 1/8/09 13:19,Product1,1200,Mastercard,valerie et nicolas,Glenn Dale ,MD,United States,1/8/09 5:31,1/30/09 17:40,38.9875,-76.82083 1/11/09 14:56,Product1,1200,Visa,Nicole,Aardal,Sogn og Fjordane,Norway,1/5/09 5:51,1/31/09 4:21,61.55,6.35 1/30/09 20:36,Product1,1200,Visa,Renee,Edinburg ,TX,United States,1/30/09 20:05,1/31/09 4:47,26.30139,-98.16306 1/1/09 8:09,Product1,1200,Mastercard,Nicole,South Melbourne,Victoria,Australia,12/30/08 0:55,1/31/09 5:40,-37.8333333,144.9666667 1/17/09 11:09,Product1,1200,Mastercard,Joachim,Fortaleza,Ceara,Brazil,1/17/09 10:46,1/31/09 6:42,-3.7166667,-38.5 1/31/09 7:22,Product1,1200,Visa,Monica ,Weston ,CT,United States,2/29/08 17:34,1/31/09 6:43,41.20083,-73.38111 1/31/09 9:12,Product1,1200,Visa,Nanci,Reading,England,United Kingdom,8/28/08 10:22,1/31/09 9:08,51.4333333,-1 1/31/09 8:56,Product1,1200,Mastercard,Laura,Coconut Grove ,FL,United States,1/31/09 8:03,1/31/09 9:22,25.71222,-80.25722 1/31/09 9:00,Product1,1200,Visa,ciara and mike,London,England,United Kingdom,1/31/09 8:32,1/31/09 10:07,51.51334,-0.08895 1/11/09 14:07,Product1,1200,Visa,Sarah,San Francisco ,CA,United States,1/11/09 13:08,1/31/09 10:20,37.775,-122.41833 1/1/09 12:25,Product2,3600,Mastercard,Anne-line,Zug,Zug,Switzerland,3/29/05 23:14,1/31/09 10:58,47.1666667,8.5166667 1/31/09 11:14,Product2,3600,Mastercard,Ulrika,Scottsdale ,AZ,United States,1/31/09 11:10,1/31/09 11:10,33.50917,-111.89833 1/2/09 9:57,Product1,1200,Amex,leigh,Potomac Falls ,VA,United States,2/20/05 17:20,1/31/09 11:24,39.05,-77.40111 1/4/09 13:20,Product1,1200,Mastercard,Nuria,Superior ,CO,United States,1/4/09 12:08,1/31/09 13:17,39.97778,-105.13139 1/22/09 12:32,Product1,1200,Mastercard,Tejal,London,England,United Kingdom,1/2/08 9:51,1/31/09 14:43,51.52721,0.14559 1/18/09 6:09,Product1,1200,Mastercard,Ignacio,Engleside ,VA,United States,5/21/07 18:56,1/31/09 15:33,38.80472,-77.04722 1/8/09 0:04,Product1,1200,Visa,ZOE,New Plymouth City,Taranaki,New Zealand,1/7/09 23:34,1/31/09 17:47,-39.0666667,174.0833333 1/24/09 7:14,Product1,1200,Mastercard,nihan,Roanoke ,VA,United States,3/2/08 7:35,1/31/09 19:18,37.20556,-80.03778 1/24/09 11:05,Product1,1200,Visa,alan,Norcross ,GA,United States,7/30/07 15:16,1/31/09 19:31,33.94111,-84.21361 1/6/09 15:12,Product1,1200,Amex,lydia,Sandy Plains ,GA,United States,9/23/06 8:42,1/31/09 20:48,34.02306,-84.36167 1/24/09 17:06,Product1,1200,Visa,Tracey,Saint Catharines,Ontario,Canada,1/24/09 15:51,1/31/09 21:10,43.1666667,-79.2333333 1/3/09 9:58,Product1,1200,Visa,Anja,Gainesville ,VA,United States,10/19/08 8:27,1/31/09 22:19,38.79556,-77.61417 1/9/09 16:35,Product1,1200,Diners,Jennifer,Nordstrand,Oslo,Norway,12/29/05 9:26,2/1/09 4:18,59.8608333,10.7905556 1/12/09 14:50,Product1,1200,Visa,Holly,Arlington ,MA,United States,1/12/09 9:54,2/1/09 7:36,42.41528,-71.15694 1/7/09 13:49,Product1,1200,Diners,megan,West Hills ,CA,United States,1/7/09 12:36,2/1/09 8:20,34.20111,-118.59722 1/9/09 19:41,Product1,1200,Mastercard,Tarah,San Jose ,CA,United States,1/5/09 18:02,2/1/09 9:18,37.33944,-121.89389 1/26/09 4:53,Product1,1200,Visa,Gerardo,London,England,United Kingdom,1/26/09 4:12,2/1/09 9:48,51.52721,0.14559 1/23/09 21:41,Product1,1200,Visa,Joanne,Oak Park ,MI,United States,12/26/08 11:00,2/1/09 9:51,42.45944,-83.18278 1/6/09 16:07,Product1,1200,Visa,Margaret,Terrell Hills ,TX,United States,12/21/08 12:21,2/1/09 10:06,29.42389,-98.49333 1/10/09 7:55,Product1,1200,Visa,Laura,Jumeira,Dubayy,United Arab Emirates,1/7/09 9:47,2/1/09 10:18,25.2097222,55.2477778 1/28/09 20:44,Product1,1200,Visa,Whitney,Falmouth ,VA,United States,1/28/09 19:36,2/1/09 11:33,38.32389,-77.46861 1/9/09 3:38,Product1,1200,Visa,Ravinder,Lurgan,Northern Ireland,United Kingdom,6/3/08 4:22,2/1/09 11:53,54.4666667,-6.3333333 1/19/09 8:52,Product1,1200,Visa,Pam,Richmond ,TX,United States,1/6/09 15:24,2/1/09 11:53,29.58194,-95.76056 1/15/09 7:26,Product1,1200,Mastercard,Celina,Den Haag,Zuid-Holland,Netherlands,1/14/09 0:00,2/1/09 13:17,52.0833333,4.3 1/30/09 19:12,Product1,1200,Diners,Heather,Ooltewah ,TN,United States,1/30/09 18:54,2/1/09 13:51,35.075,-85.06222 1/5/09 12:41,Product1,1200,Mastercard,Kathryn,Pacific Beach ,CA,United States,1/5/09 11:50,2/1/09 14:28,32.79778,-117.23944 1/28/09 20:59,Product1,1200,Visa,Michele ,Austin ,TX,United States,1/28/09 9:40,2/1/09 15:00,30.26694,-97.74278 1/10/09 21:36,Product1,1200,Visa,Craig,Seattle ,WA,United States,8/10/08 16:47,2/1/09 15:27,47.60639,-122.33083 1/25/09 19:59,Product1,1200,Visa,Kim,Seattle ,WA,United States,8/13/08 18:27,2/1/09 16:04,47.60639,-122.33083 1/7/09 8:03,Product1,1200,Amex,maria,Ottawa,Ontario,Canada,4/17/05 22:28,2/1/09 18:52,45.4166667,-75.7 1/21/09 9:07,Product1,1200,Visa,Elaine,Vienna ,VA,United States,4/2/08 9:59,2/1/09 21:07,38.90111,-77.26556 1/23/09 14:43,Product1,1200,Visa,Madison,Torbay,Auckland,New Zealand,1/18/09 11:34,2/1/09 21:31,-36.7,174.75 1/5/09 13:07,Product1,1200,Visa,Amanda,Shenfield,England,United Kingdom,1/2/09 14:27,2/1/09 22:27,51.6166667,0.3166667 1/6/09 3:39,Product1,1200,Visa,Krista,Bergen,Hordaland,Norway,9/20/05 1:58,2/2/09 0:08,60.3911111,5.3247222 1/15/09 15:26,Product1,1200,Visa,Sarah,Bolton,England,United Kingdom,1/15/09 8:16,2/2/09 0:53,53.5833333,-2.4333333 1/23/09 4:47,Product1,1200,Mastercard,Sarah,Sandymount,Dublin,Ireland,1/16/06 8:48,2/2/09 2:12,53.335,-6.2113889 1/12/09 10:05,Product2,3600,Amex,Pamela,Bellinzona,Ticino,Switzerland,9/3/07 13:23,2/2/09 5:16,46.2,9.0166667 1/30/09 5:13,Product1,1200,Visa,Christine,Antwerpen,Antwerpen,Belgium,1/3/06 13:57,2/2/09 5:45,51.2166667,4.4166667 1/14/09 10:32,Product3,7500,Mastercard,Diana,Campinas,Sao Paulo,Brazil,11/5/08 7:03,2/2/09 5:54,-22.9,-47.0833333 1/12/09 8:13,Product1,1200,Amex,mary,Nacka,Stockholm,Sweden,3/8/06 4:32,2/2/09 6:01,59.3,18.1666667 1/27/09 8:11,Product1,1200,Visa,Helena,Fremont ,CA,United States,1/27/09 8:05,2/2/09 6:08,37.54833,-121.9875 1/30/09 17:33,Product1,1200,Visa,nina,Warwick,Queensland,Australia,1/25/09 22:36,2/2/09 6:13,-28.2333333,152.0166667 1/15/09 9:52,Product1,1200,Amex,Mark,Holmdel ,NJ,United States,1/15/09 8:36,2/2/09 7:00,40.345,-74.18444 1/13/09 11:54,Product1,1200,Visa,alice and rudolf,Baltimore ,MD,United States,1/8/09 11:11,2/2/09 8:01,39.2725,-76.53167 1/21/09 11:00,Product1,1200,Visa,Costanza,Saggart,Dublin,Ireland,1/19/09 10:11,2/2/09 8:29,53.2802778,-6.4444444 1/16/09 11:49,Product1,1200,Mastercard,Yoko,Andover ,MA,United States,2/18/08 18:56,2/2/09 8:53,42.65833,-71.1375 1/1/09 9:35,Product1,1200,Mastercard,Barbara,La Crescenta ,CA,United States,12/31/08 17:51,2/2/09 10:27,34.22417,-118.23917 1/13/09 5:58,Product1,1200,Mastercard,Kit,Suwanee ,GA,United States,1/5/09 21:12,2/2/09 13:13,34.05139,-84.07139 1/6/09 16:08,Product2,3600,Visa,cristina,Seattle ,WA,United States,3/14/05 16:39,2/2/09 14:17,47.60639,-122.33083 1/5/09 10:25,Product1,1200,Amex,linda,Arlington ,VA,United States,10/11/08 3:50,2/2/09 16:13,38.89028,-77.08444 1/4/09 21:08,Product1,1200,Mastercard,Christyna,Calgary,Alberta,Canada,1/21/08 20:11,2/2/09 18:50,51.0833333,-114.0833333 1/12/09 20:43,Product1,1200,Visa,Alicja ,Kenmore ,WA,United States,1/12/09 20:31,2/2/09 20:26,47.7575,-122.24278 1/17/09 3:22,Product1,1200,Visa,Rachel,Fresno ,CA,United States,2/1/08 12:45,2/2/09 20:35,36.74778,-119.77139 1/18/09 11:17,Product1,1200,Amex,Rachel,Atascadero ,CA,United States,3/11/08 13:35,2/2/09 22:49,35.48944,-120.66972 1/27/09 9:01,Product1,1200,Visa,Jan,Barcelona,Catalonia,Spain,5/29/08 12:23,2/3/09 0:59,41.3833333,2.1833333 1/8/09 8:11,Product1,1200,Diners,Karin,High Wycombe,England,United Kingdom,1/8/09 7:00,2/3/09 1:54,51.6333333,-0.7666667 1/26/09 23:28,Product2,3600,Amex,ron ,Tsaritsyno,Moscow City,Russia,12/7/06 8:26,2/3/09 2:10,55.6283333,37.6608333 1/10/09 21:35,Product1,1200,Mastercard,Sharon,Ajax,Ontario,Canada,8/7/08 6:17,2/3/09 3:42,43.85,-79.0166667 1/11/09 6:01,Product1,1200,Mastercard,Anna,New York ,NY,United States,1/1/09 10:24,2/3/09 4:25,40.71417,-74.00639 1/19/09 14:53,Product1,1200,Mastercard,Laura,Fairfield ,IA,United States,12/12/08 5:18,2/3/09 5:40,41.00861,-91.9625 1/22/09 7:14,Product1,1200,Visa,Yana,North Bay,Ontario,Canada,10/11/06 19:22,2/3/09 6:36,46.3,-79.45 1/15/09 8:12,Product1,1200,Visa,Katherine,Marietta ,GA,United States,1/13/09 10:03,2/3/09 7:44,33.9525,-84.55 1/7/09 6:33,Product1,1200,Diners,Therese,Clontarf,Dublin,Ireland,6/15/08 8:08,2/3/09 7:51,53.3591667,-6.2161111 1/12/09 8:05,Product1,1200,Amex,Francoise ,Danville ,PA,United States,1/12/09 6:44,2/3/09 8:01,40.96333,-76.61306 1/28/09 13:03,Product2,3600,Amex,Elizabeth,Okotoks,Alberta,Canada,9/10/08 6:53,2/3/09 9:13,50.7166667,-113.9666667 1/25/09 8:54,Product1,1200,Amex,Corinne,Anthem ,AZ,United States,3/26/06 17:32,2/3/09 9:50,33.86722,-112.14611 1/5/09 10:08,Product1,1200,Visa,Ec,Clonmel,Tipperary,Ireland,1/5/09 7:47,2/3/09 10:21,52.355,-7.7038889 1/5/09 19:29,Product1,1200,Visa,Carmen,Arlington ,VA,United States,4/29/08 16:09,2/3/09 10:23,38.89028,-77.08444 1/7/09 19:06,Product2,3600,Amex,Brittany,Orlando ,FL,United States,8/10/04 3:30,2/3/09 11:32,28.53806,-81.37944 1/23/09 11:33,Product1,1200,Mastercard,Sandrine,Walnut Creek ,CA,United States,1/22/09 23:31,2/3/09 11:49,37.90639,-122.06389 1/3/09 21:11,Product1,1200,Mastercard,asuncion ,Centennial ,CO,United States,12/3/08 13:00,2/3/09 11:50,39.57917,-104.87639 1/11/09 17:28,Product1,1200,Visa,Sophie,Newtown ,CT,United States,1/11/09 11:50,2/3/09 12:21,41.41389,-73.30389 1/21/09 20:18,Product1,1200,Amex,Henrietta,Vancouver,British Columbia,Canada,7/6/07 23:53,2/3/09 12:22,49.25,-123.1333333 1/24/09 10:23,Product1,1200,Visa,DD,York,England,United Kingdom,8/19/08 12:58,2/3/09 12:57,53.9666667,-1.0833333 1/7/09 14:55,Product1,1200,Visa,Jennifer,Drogheda,Louth,Ireland,9/21/06 2:39,2/3/09 13:36,53.7188889,-6.3477778 1/29/09 10:38,Product1,1200,Visa,samuel,Saddle Brook ,NJ,United States,1/29/09 9:08,2/3/09 14:39,40.89889,-74.09306 1/8/09 14:04,Product1,1200,Amex,Angelina Patrick,San Diego ,CA,United States,1/7/09 17:01,2/3/09 14:57,32.71528,-117.15639 1/31/09 21:50,Product1,1200,Visa,Sven,Issaquah ,WA,United States,1/31/09 21:01,2/3/09 16:30,47.53028,-122.03139 1/1/09 16:00,Product1,1200,Visa,Toni,Bolton,England,United Kingdom,10/7/08 15:19,2/3/09 16:45,53.5833333,-2.4333333 1/30/09 13:13,Product1,1200,Visa,Patrick,Lexington ,MA,United States,1/30/09 12:44,2/3/09 17:14,42.44722,-71.225 1/27/09 16:50,Product1,1200,Visa,jason,Altadena ,CA,United States,12/28/08 14:42,2/3/09 18:09,34.18972,-118.13028 1/30/09 7:42,Product1,250,Visa,Tabatha,Altadena ,CA,United States,12/28/08 14:42,2/3/09 18:09,34.18972,-118.13028 1/17/09 15:48,Product2,3600,Visa,Aline,Davis ,CA,United States,1/8/05 14:03,2/3/09 19:14,38.545,-121.73944 1/12/09 11:40,Product2,3600,Visa,Debra,Toronto,Ontario,Canada,12/30/08 6:59,2/3/09 19:42,43.6666667,-79.4166667 1/30/09 20:27,Product1,1200,Mastercard,Natasha,Pasadena ,CA,United States,1/30/09 20:02,2/3/09 23:39,34.14778,-118.14361 1/27/09 18:35,Product1,1200,Mastercard,Melinda,Buffalo Grove ,IL,United States,1/27/09 18:28,2/3/09 23:42,41.98111,-89.595 1/16/09 12:47,Product1,1200,Visa,Luc1nda,London,England,United Kingdom,12/12/04 15:18,2/4/09 2:13,51.52721,0.14559 1/2/09 2:50,Product1,1200,Visa,Kim,Newcastle,Wicklow,Ireland,10/12/05 6:56,2/4/09 2:19,53.0683333,-6.0658333 1/21/09 5:39,Product1,1200,Amex,Britlyn ,Norwalk ,CT,United States,11/4/08 9:51,2/4/09 4:31,41.1175,-73.40833 1/28/09 1:28,Product1,1200,Diners,Adam,Besancon,Franche-Comte,France,1/26/09 2:28,2/4/09 5:39,47.25,6.0333333 1/8/09 13:33,Product1,1200,Visa,Mimi,Monte-Carlo, ,Monaco,9/23/06 13:19,2/4/09 6:16,43.7333333,7.4166667 1/22/09 12:09,Product1,1200,Visa,Liann,Monaco, ,Monaco,1/22/09 11:32,2/4/09 6:28,43.7333333,7.4166667 1/20/09 8:23,Product1,1200,Mastercard,Sarah,Floyds Knobs ,IN,United States,10/12/05 17:17,2/4/09 8:16,38.32444,-85.87361 1/2/09 7:47,Product1,1200,Diners,Naseer,London,England,United Kingdom,12/8/08 6:45,2/4/09 8:50,51.5,-0.1166667 1/11/09 4:55,Product1,1200,Amex,Caroline,Marietta ,GA,United States,4/12/06 18:20,2/4/09 9:22,33.9525,-84.55 1/23/09 7:47,Product1,1800,Amex,Karena,Marietta ,GA,United States,4/12/06 18:20,2/4/09 9:22,33.9525,-84.55 1/21/09 23:19,Product1,1200,Amex,janet,Hon ,HI,United States,9/4/08 16:51,2/4/09 11:11,21.30694,-157.85833 1/11/09 4:29,Product3,7500,Visa,Hans,Knoxville ,TN,United States,8/28/08 6:20,2/4/09 12:17,35.96056,-83.92083 1/11/09 4:39,Product1,1200,Visa,Sandra Thierry Zoe,Knoxville ,TN,United States,8/28/08 6:20,2/4/09 12:17,35.96056,-83.92083 1/10/09 8:13,Product1,1200,Mastercard,Eleanor,Edinburgh,Scotland,United Kingdom,7/31/08 22:34,2/4/09 13:08,55.95,-3.2 1/22/09 12:55,Product1,1200,Visa,Anna,Paris,Ile-de-France,France,8/17/07 4:34,2/4/09 13:12,48.8666667,2.3333333 1/17/09 15:00,Product1,1200,Visa,Cara ,Humble ,TX,United States,3/12/07 14:55,2/4/09 13:29,29.99861,-95.26194 1/4/09 14:06,Product1,1200,Visa,carolien,Mashpee ,MA,United States,1/4/09 12:21,2/4/09 13:45,41.64833,-70.48167 1/30/09 17:09,Product1,1200,Mastercard,Ana,Hong Kong, ,Hong Kong,7/28/06 2:31,2/4/09 16:26,22.2833333,114.15 1/20/09 5:01,Product1,1200,Visa,Patrick,Birmingham ,MI,United States,1/18/09 17:36,2/4/09 16:45,42.54667,-83.21139 1/26/09 14:37,Product1,1200,Visa,Heidi,St Augustine ,FL,United States,12/19/07 12:00,2/4/09 16:55,29.89444,-81.31472 1/29/09 13:27,Product1,1200,Visa,Tom,Salt Lake City ,UT,United States,1/28/09 14:47,2/4/09 20:07,40.76083,-111.89028 1/12/09 10:33,Product1,1200,Amex,Justine,Seattle ,WA,United States,1/7/09 16:45,2/4/09 20:57,47.60639,-122.33083 1/5/09 8:28,Product1,1200,Visa,isabel,Ruti,Zurich,Switzerland,1/5/09 5:08,2/4/09 22:59,47.25,8.85 1/25/09 16:11,Product3,7500,Visa,scott,Rogers ,AR,United States,1/25/09 15:55,2/5/09 0:20,36.33194,-94.11833 1/25/09 20:44,Product1,1200,Visa,Fatima,Rogers ,AR,United States,1/25/09 15:55,2/5/09 0:20,36.33194,-94.11833 1/26/09 11:36,Product1,1200,Visa,Judy,Dun Laoghaire,Dublin,Ireland,1/26/09 7:28,2/5/09 2:38,53.2925,-6.1286111 1/27/09 2:32,Product1,1200,Visa,Glenn,Perth,Scotland,United Kingdom,6/27/06 9:12,2/5/09 3:15,56.4,-3.4333333 1/18/09 13:36,Product1,1200,Amex,Family in,London,England,United Kingdom,4/23/05 9:46,2/5/09 3:17,51.51334,-0.08895 1/7/09 5:53,Product1,1200,Visa,Lauren,Gries,Rhineland-Palatinate,Germany,1/7/09 2:49,2/5/09 3:41,49.4166667,7.4 1/25/09 1:53,Product3,7500,Visa,Michael,Pietermaritzburg,KwaZulu-Natal,South Africa,1/24/09 12:52,2/5/09 4:37,-29.6166667,30.3833333 1/18/09 11:42,Product1,1200,Visa,Jodi,Sutton Valence,England,United Kingdom,11/17/08 10:30,2/5/09 6:21,51.2,0.5833333 1/13/09 1:46,Product1,1200,Mastercard,simone,Lyngby,Kobenhavn,Denmark,10/30/07 12:03,2/5/09 8:52,55.7666667,12.5166667 1/2/09 15:57,Product1,1200,Diners,Sonja,Alpine ,NJ,United States,1/2/09 15:25,2/5/09 10:18,40.95583,-73.93167 1/25/09 8:50,Product1,1200,Mastercard,Shane,Zurich,Zurich,Switzerland,1/24/09 12:23,2/5/09 11:07,47.3666667,8.55 1/14/09 8:16,Product2,3600,Amex,Ruth,Saskatoon,Saskatchewan,Canada,8/9/08 12:51,2/5/09 11:24,52.1333333,-106.6666667 1/27/09 11:21,Product1,1200,Mastercard,Cleo,Pacific Palisades ,CA,United States,1/27/09 10:38,2/5/09 12:38,34.04806,-118.52556 1/8/09 10:13,Product1,1200,Diners,Benoit,Fort Saint James,British Columbia,Canada,1/7/09 16:01,2/5/09 14:03,54.4333333,-124.25 1/5/09 7:47,Product1,1200,Amex,Claire,Versoix,Geneve,Switzerland,4/18/07 12:55,2/5/09 15:15,46.2833333,6.1666667 1/22/09 9:00,Product1,1200,Visa,Claire,Trumansburg ,NY,United States,7/6/08 14:33,2/5/09 16:33,42.54222,-76.66639 1/25/09 12:59,Product1,1200,Visa,Lindsey,Kennett Square ,PA,United States,1/13/09 20:08,2/5/09 18:40,39.84667,-75.71194 1/10/09 19:28,Product2,3600,Visa,Nicola,San Jose ,CA,United States,8/5/05 0:29,2/5/09 21:10,37.33944,-121.89389 1/8/09 19:29,Product2,3600,Mastercard,PATRICK,Ban Khlong Sip,Krung Thep,Thailand,1/8/09 0:01,2/5/09 21:22,13.9166667,100.8166667 1/8/09 12:04,Product1,1200,Visa,jennifer,Morro Bay ,CA,United States,12/1/03 19:13,2/5/09 22:11,35.36583,-120.84889 1/4/09 16:59,Product1,1200,Visa,Amy,Parramatta,New South Wales,Australia,1/3/09 22:35,2/5/09 22:44,-33.8166667,151 1/30/09 11:56,Product1,1200,Mastercard,Whitney,Dumbleton,England,United Kingdom,7/31/08 13:46,2/6/09 0:04,52.0166667,-1.9666667 1/6/09 5:10,Product1,1200,Visa,Astrid,Altlengbach,Lower Austria,Austria,6/24/08 0:49,2/6/09 0:37,48.15,15.9166667 1/14/09 3:39,Product1,1200,Visa,jo,Ballincollig,Cork,Ireland,12/10/08 7:41,2/6/09 2:36,51.8833333,-8.5833333 1/14/09 3:47,Product1,1200,Visa,Michelle,Ballincollig,Cork,Ireland,12/10/08 7:41,2/6/09 2:36,51.8833333,-8.5833333 1/19/09 3:19,Product1,1200,Mastercard,TG,Zagore,Stara Zagora,Bulgaria,11/20/08 3:00,2/6/09 4:19,42.35,25.6666667 1/7/09 1:42,Product1,1200,Mastercard,Emily,Vecmilgravis,Riga,Latvia,1/4/09 10:33,2/6/09 4:20,57.0333333,24.1 1/7/09 13:01,Product2,3600,Visa,Niki,Trelex,Vaud,Switzerland,8/5/07 0:43,2/6/09 5:02,46.4166667,6.2 1/27/09 2:35,Product1,1200,Visa,Sarah,Ornex,Rhone-Alpes,France,8/28/08 6:28,2/6/09 5:09,46.2833333,6.1 1/3/09 14:14,Product1,1200,Visa,sherry,Las Vegas ,NV,United States,1/3/09 13:49,2/6/09 5:29,36.175,-115.13639 1/22/09 12:37,Product2,3600,Amex,Laura,San Anselmo ,CA,United States,1/22/09 10:17,2/6/09 6:38,37.97472,-122.56056 1/29/09 6:49,Product1,1200,Mastercard,Carmela,Hannover,Lower Saxony,Germany,4/2/08 2:39,2/6/09 6:52,52.3666667,9.7166667 1/6/09 9:45,Product1,1200,Diners,Matt,N Woodmere ,NY,United States,12/30/08 13:01,2/6/09 7:33,40.66417,-73.70889 1/12/09 11:16,Product1,1200,Visa,Karen,Madrid,Madrid,Spain,7/17/07 6:08,2/6/09 10:42,40.4,-3.6833333 1/13/09 13:49,Product1,1200,Visa,Joanne,Castlebar,Mayo,Ireland,1/6/08 14:03,2/6/09 12:35,53.85,-9.3 1/12/09 7:23,Product1,1200,Visa,Stephanie,Fairfax ,CA,United States,1/11/09 14:42,2/6/09 16:13,37.98722,-122.58778 1/30/09 4:48,Product1,1200,Visa,Hurst,Chandler ,AZ,United States,6/18/08 14:29,2/6/09 17:21,33.30611,-111.84056 1/22/09 16:29,Product1,1200,Visa,Liza,Dammeron Valley ,UT,United States,1/17/09 15:18,2/6/09 18:14,37.1306,-113.6492 1/27/09 6:26,Product1,1200,Mastercard,Michele,Buffalo ,NY,United States,1/25/09 11:56,2/6/09 18:24,42.88639,-78.87861 1/15/09 10:16,Product3,7500,Visa,Karin,Olive Branch ,MS,United States,1/12/09 17:41,2/6/09 18:48,34.96167,-89.82944 1/19/09 18:54,Product1,1200,Amex,cath,Warwick ,NY,United States,1/19/09 11:34,2/6/09 19:27,41.25639,-74.36028 1/2/09 22:44,Product2,3600,Visa,eva,Gisborne,Victoria,Australia,12/3/06 15:36,2/6/09 20:03,-37.4833333,144.5833333 1/1/09 18:32,Product1,1200,Amex,Andrea ,San Mateo ,CA,United States,12/31/08 17:09,2/6/09 21:59,37.56306,-122.32444 1/14/09 1:28,Product1,1200,Mastercard,Sabine,Milton Keynes,England,United Kingdom,6/24/06 15:10,2/7/09 0:26,52.0333333,-0.7 1/20/09 8:08,Product1,1200,Mastercard,Aideen and Jonathan,Kecskemet,Bacs-Kiskun,Hungary,1/19/09 5:49,2/7/09 1:12,46.9,19.7833333 1/29/09 2:48,Product1,1200,Visa,George,Nakskov,Storstrom,Denmark,1/29/09 2:19,2/7/09 2:09,54.8333333,11.15 1/24/09 18:02,Product1,1200,Visa,Helen,Aloma ,FL,United States,11/29/05 17:33,2/7/09 6:03,28.60056,-81.30667 1/7/09 8:26,Product1,1200,Diners,C,Chandler ,AZ,United States,1/6/09 16:23,2/7/09 6:05,33.30611,-111.84056 1/24/09 3:36,Product1,1200x,Visa,chris,Kjobenhavn,Staden Kobenhavn,Denmark,1/20/09 13:11,2/7/09 6:52,55.6666667,12.5833333 1/5/09 15:23,Product1,1200,Visa,maggie,Stockton,England,United Kingdom,6/12/08 10:59,2/7/09 11:08,52.25,-2.7 1/25/09 16:17,Product1,1200,Amex,Mareike,Cumming ,GA,United States,1/24/09 18:06,2/7/09 11:28,34.20722,-84.14028 1/15/09 10:37,Product1,1200,Visa,lamia,Little Compton ,RI,United States,6/28/08 11:04,2/7/09 12:00,41.51,-71.17167 1/20/09 15:28,Product1,1200,Visa,Madhu,Centennial ,CO,United States,12/2/06 23:24,2/7/09 15:18,39.57917,-104.87639 1/28/09 18:00,Product1,13000,Visa,sandhya,Centennial ,CO,United States,12/2/06 23:24,2/7/09 15:18,39.57917,-104.87639 1/29/09 5:06,Product1,1200,Amex,Kimberly,Herndon ,VA,United States,1/23/08 10:05,2/7/09 15:23,38.96944,-77.38639 1/6/09 18:53,Product1,1200,Visa,Tania,Vista ,CA,United States,1/5/09 22:37,2/7/09 15:48,33.2,-117.24167 1/21/09 6:55,Product1,1200,Visa,andrea,Oostburg ,WI,United States,1/20/09 13:33,2/7/09 16:48,43.62278,-87.79444 1/26/09 20:18,Product1,1200,Mastercard,John,Griffith,New South Wales,Australia,1/15/07 20:37,2/7/09 18:04,-34.2833333,146.0333333 1/25/09 17:58,Product2,3600,Visa,carol,Ann Arbor ,MI,United States,7/5/08 9:20,2/7/09 18:51,42.27083,-83.72639 1/9/09 14:37,Product1,1200,Visa,Nona,South Jordan ,UT,United States,1/8/09 15:14,2/7/09 19:11,40.56222,-111.92889 1/25/09 2:46,Product2,3600,Visa,Family,Dubai,Dubayy,United Arab Emirates,1/8/09 1:19,2/8/09 2:06,25.2522222,55.28 1/17/09 20:46,Product2,3600,Visa,Michelle,Dubai,Dubayy,United Arab Emirates,4/13/08 2:36,2/8/09 2:12,25.2522222,55.28 1/24/09 7:18,Product2,3600,Visa,Kathryn,Kirriemuir,Scotland,United Kingdom,1/23/09 10:31,2/8/09 2:52,56.6666667,-3 1/11/09 7:09,Product1,1200,Visa,Oswald,Tramore,Waterford,Ireland,10/13/08 16:43,2/8/09 3:02,52.1588889,-7.1463889 1/8/09 4:15,Product1,1200,Visa,Elyssa,Gdansk,Pomorskie,Poland,1/7/09 15:00,2/8/09 3:50,54.35,18.6666667 1/22/09 10:47,Product1,1200,Visa,michelle,Arklow,Wicklow,Ireland,11/18/08 1:32,2/8/09 5:07,52.7930556,-6.1413889 1/26/09 20:47,Product1,1200,Mastercard,Alicia,Lincoln ,NE,United States,6/24/08 8:05,2/8/09 7:29,40.8,-96.66667 1/12/09 12:22,Product1,1200,Mastercard,JP,Tierp,Uppsala,Sweden,1/6/09 11:34,2/8/09 11:15,60.3333333,17.5 1/26/09 1:44,Product2,3600,Visa,Geraldine,Brussels,Brussels (Bruxelles),Belgium,1/31/08 13:28,2/8/09 14:39,50.8333333,4.3333333 1/18/09 12:57,Product1,1200,Mastercard,sandra,Burr Oak ,IA,United States,1/24/08 16:11,2/8/09 15:30,43.45889,-91.86528 1/24/09 21:26,Product1,1200,Visa,Olivia,Wheaton ,IL,United States,5/8/08 16:02,2/8/09 16:00,41.86611,-88.10694 1/26/09 12:26,Product2,3600,Mastercard,Tom,Killeen ,TX,United States,1/26/09 5:23,2/8/09 17:33,31.11694,-97.7275 1/5/09 7:37,Product1,1200,Visa,Annette ,Manhattan ,NY,United States,9/26/08 4:29,2/8/09 18:42,40.71417,-74.00639 1/14/09 12:33,Product1,1200,Visa,SUSAN,Oxford,England,United Kingdom,9/11/08 23:23,2/8/09 23:00,51.75,-1.25 1/14/09 0:15,Product2,3600,Visa,Michael,Paris,Ile-de-France,France,11/28/08 0:07,2/9/09 1:30,48.8666667,2.3333333 1/1/09 12:42,Product1,1200,Visa,ashton,Exeter,England,United Kingdom,12/15/08 1:16,2/9/09 2:52,50.7,-3.5333333 1/6/09 6:07,Product1,1200,Visa,Scott,Rungsted,Frederiksborg,Denmark,12/27/08 14:29,2/9/09 4:20,55.8841667,12.5419444 1/15/09 5:11,Product2,3600,Visa,Pam,London,England,United Kingdom,7/11/06 12:43,2/9/09 4:42,51.52721,0.14559 1/17/09 4:03,Product1,1200,Visa,Lisa ,Borja,Bohol,Philippines,1/17/09 2:45,2/9/09 6:09,9.9136111,124.0927778 1/19/09 10:13,Product2,3600,Mastercard,Pavel,London,England,United Kingdom,2/28/06 5:35,2/9/09 6:57,51.51334,-0.08895 1/18/09 9:42,Product1,1200,Visa,Richard,Jamestown ,RI,United States,1/18/09 9:22,2/9/09 8:30,41.49694,-71.36778 1/9/09 11:14,Product1,1200,Visa,Jasinta Jeanne,Owings Mills ,MD,United States,1/9/09 10:43,2/9/09 9:17,39.41944,-76.78056 1/10/09 13:42,Product1,1200,Visa,Rachel,Hamilton,Ontario,Canada,1/10/09 12:22,2/9/09 9:54,43.25,-79.8333333 1/7/09 7:28,Product1,1200,Amex,Cherish ,Anchorage ,AK,United States,7/28/08 7:31,2/9/09 10:50,61.21806,-149.90028 1/18/09 6:46,Product1,1200,Visa,Shona ,Mornington,Meath,Ireland,1/15/09 9:13,2/9/09 11:55,53.7233333,-6.2825 1/30/09 12:18,Product1,1200,Mastercard,Abikay,Fullerton ,CA,United States,1/26/09 13:34,2/9/09 12:53,33.87028,-117.92444 1/6/09 5:42,Product1,1200,Amex,Abikay,Atlanta ,GA,United States,10/27/08 14:16,2/9/09 13:50,33.74889,-84.38806 1/2/09 10:58,Product2,3600,Visa,Kendra,Toronto,Ontario,Canada,1/2/09 10:38,2/9/09 13:56,43.6666667,-79.4166667 1/8/09 3:29,Product1,1200,Visa,amanda,Liverpool,England,United Kingdom,12/22/08 1:41,2/9/09 14:06,53.4166667,-3 1/12/09 13:23,Product2,3600,Amex,Leila,Ponte San Nicolo,Veneto,Italy,9/13/05 8:42,2/9/09 14:09,45.3666667,11.6166667 1/19/09 9:34,Product1,1200,Amex,amanda,Las Vegas ,NV,United States,5/10/08 8:56,2/9/09 16:44,36.175,-115.13639 1/9/09 7:49,Product1,1200,Visa,Stacy,Rochester Hills ,MI,United States,7/28/08 7:18,2/9/09 17:41,42.68056,-83.13389 1/15/09 5:27,Product2,3600,Visa,Derrick,North Bay,Ontario,Canada,1/6/09 17:42,2/9/09 18:22,46.3,-79.45 1/8/09 23:40,Product1,1200,Visa,Jacob,Lindfield,New South Wales,Australia,1/8/09 17:52,2/9/09 18:31,-33.7833333,151.1666667 1/27/09 11:02,Product1,1200,Mastercard,DOREEN,Madrid,Madrid,Spain,1/24/09 8:21,2/9/09 18:42,40.4,-3.6833333 1/14/09 13:23,Product1,1200,Diners,eugenia,Wisconsin Rapids ,WI,United States,11/15/08 13:57,2/9/09 18:44,44.38361,-89.81722 1/7/09 20:01,Product1,1200,Visa,Karen,Austin ,TX,United States,1/6/09 19:16,2/9/09 19:56,30.26694,-97.74278 1/20/09 12:32,Product1,1200,Visa,Bea,Chicago ,IL,United States,1/16/09 19:08,2/9/09 20:42,41.85,-87.65 1/6/09 14:35,Product1,1200,Diners,Hilde Karin,Las Vegas ,NV,United States,12/17/08 11:59,2/9/09 22:59,36.175,-115.13639 1/4/09 6:51,Product1,1200,Visa,Rima,Mullingar,Westmeath,Ireland,1/3/09 12:34,2/10/09 0:59,53.5333333,-7.35 1/24/09 18:30,Product1,1200,Visa,Ruangrote,Melbourne,Victoria,Australia,7/17/08 5:19,2/10/09 2:12,-37.8166667,144.9666667 1/25/09 5:57,Product1,1200,Amex,pamela,Ayacucho,Buenos Aires,Argentina,1/24/09 9:29,2/10/09 6:38,-37.15,-58.4833333 1/5/09 10:02,Product2,3600,Visa,Emillie,Eagan ,MN,United States,1/5/09 9:03,2/10/09 7:29,44.80417,-93.16667 1/13/09 9:14,Product1,1200,Visa,sangeeta,Vossevangen,Hordaland,Norway,1/9/09 9:31,2/10/09 9:04,60.6333333,6.4333333 1/22/09 7:35,Product1,1200,Visa,Anja,Ferney-Voltaire,Rhone-Alpes,France,1/22/09 6:51,2/10/09 9:18,46.25,6.1166667 1/2/09 11:06,Product1,1200,Mastercard,Andrew,Sevilla,Andalucia,Spain,3/12/06 15:02,2/10/09 10:04,37.3772222,-5.9869444 1/11/09 9:50,Product1,1200,Visa,Bato,Munchengosserstadt,Thuringia,Germany,1/7/09 11:45,2/10/09 10:28,51.05,11.65 1/21/09 20:44,Product1,1200,Mastercard,Ailsa ,Lindenhurst ,NY,United States,1/21/09 7:47,2/10/09 10:51,40.68667,-73.37389 1/5/09 9:09,Product1,1200,Visa,Sophie,Bloomfield ,MI,United States,10/23/06 6:52,2/10/09 10:58,42.53778,-83.23306 1/5/09 12:41,Product1,1200,Visa,Katrin,Calgary,Alberta,Canada,12/3/08 14:49,2/10/09 11:45,51.0833333,-114.0833333 1/28/09 12:54,Product2,3600,Mastercard,Kelly ,Vancouver,British Columbia,Canada,1/27/09 21:04,2/10/09 12:09,49.25,-123.1333333 1/21/09 4:46,Product1,1200,Visa,Tomasz,Klampenborg,Kobenhavn,Denmark,6/10/08 11:25,2/10/09 12:22,55.7666667,12.6 1/7/09 13:28,Product1,1200,Visa,Elizabeth,Calne,England,United Kingdom,1/4/09 13:07,2/10/09 12:39,51.4333333,-2 1/27/09 11:18,Product2,3600,Amex,Michael,Los Angeles ,CA,United States,1/23/09 11:47,2/10/09 13:09,34.05222,-118.24278 1/7/09 12:39,Product2,3600,Visa,Natasha,Milano,Lombardy,Italy,6/2/06 13:01,2/10/09 13:19,45.4666667,9.2 1/24/09 13:54,Product2,3600,Mastercard,Meredith,Kloten,Zurich,Switzerland,1/24/09 12:30,2/10/09 13:47,47.45,8.5833333 1/30/09 6:48,Product1,1200,Mastercard,Nicole,Fayetteville ,NC,United States,1/30/09 4:51,2/10/09 14:41,35.0525,-78.87861 1/22/09 18:07,Product1,1200,Visa,Ryan,Simpsonville ,SC,United States,1/6/09 16:59,2/10/09 15:30,34.73694,-82.25444 1/29/09 15:03,Product1,1200,Visa,Mary ,Auckland,Auckland,New Zealand,2/9/06 11:14,2/10/09 16:31,-36.8666667,174.7666667 1/2/09 14:14,Product1,1200,Diners,Aaron,Reading,England,United Kingdom,11/16/08 15:49,2/10/09 16:38,51.4333333,-1 1/19/09 11:05,Product1,1200,Visa,Bertrand,North Caldwell ,NJ,United States,10/3/08 5:55,2/10/09 18:16,40.83972,-74.27694 1/28/09 16:17,Product1,1200,Mastercard,Zoe,Coventry,England,United Kingdom,1/28/09 15:59,2/10/09 19:55,52.4166667,-1.55 1/8/09 12:46,Product1,1200,Mastercard,Trine Marie,Orillia,Ontario,Canada,12/16/08 22:57,2/10/09 22:11,44.6,-79.4166667 1/29/09 16:07,Product1,1200,Diners,Kim,Paris,Ile-de-France,France,1/29/09 15:45,2/10/09 22:24,48.8666667,2.3333333 1/29/09 13:41,Product1,1200,Visa,John ,San Jose ,CA,United States,1/14/04 21:59,2/10/09 23:58,37.33944,-121.89389 1/8/09 6:29,Product1,1200,Visa,Rich,Ingelheim-Mitte,Rhineland-Palatinate,Germany,3/24/06 6:21,2/10/09 23:59,49.9833333,8.0666667 1/4/09 12:53,Product1,1200,Diners,Kayla,Leamington Spa,England,United Kingdom,12/11/08 7:35,2/11/09 0:04,52.3,-1.5333333 1/14/09 12:55,Product1,1200,Visa,Richard and Comfort,Regensdorf,Zurich,Switzerland,1/11/09 10:36,2/11/09 1:58,47.4333333,8.4666667 1/14/09 6:35,Product1,1200,Visa,Eric,Melbourne,Victoria,Australia,7/25/08 7:02,2/11/09 2:05,-37.8166667,144.9666667 1/27/09 13:08,Product1,1200,Mastercard,Melissa,Geneve,Geneve,Switzerland,5/9/08 8:50,2/11/09 2:19,46.2,6.1666667 1/31/09 23:09,Product1,1200,Diners,Dawn,Vaucluse,New South Wales,Australia,9/13/04 22:55,2/11/09 3:09,-33.8666667,151.2833333 1/21/09 14:34,Product1,1200,Mastercard,Tamara,Klosterneuburg,Lower Austria,Austria,1/21/09 14:12,2/11/09 3:19,48.3,16.3166667 1/16/09 8:28,Product1,1200,Visa,Ashley,Rancho Cordova ,CA,United States,1/9/09 12:13,2/11/09 8:34,38.58917,-121.30167 1/11/09 9:55,Product1,1200,Visa,familly ,Creemore,Ontario,Canada,1/10/09 7:14,2/11/09 8:45,44.3166667,-80.1 1/8/09 2:46,Product1,1200,Mastercard,Ken,Sidcup,England,United Kingdom,11/26/07 16:44,2/11/09 11:00,51.4166667,0.1166667 1/26/09 7:11,Product1,1200,Visa,Tori,Minneapolis ,MN,United States,11/22/08 21:06,2/11/09 11:35,44.98,-93.26361 1/31/09 5:39,Product2,3600,Mastercard,Hanne,Phoenix ,MD,United States,10/5/04 4:37,2/11/09 11:45,39.51639,-76.61639 1/9/09 8:35,Product1,1200,Amex,Precious,Edmonton,Alberta,Canada,1/8/09 14:14,2/11/09 14:26,53.55,-113.5 1/24/09 3:25,Product1,1200,Visa,Michelle,Lyndoch,South Australia,Australia,9/26/08 19:23,2/11/09 15:05,-34.6166667,138.8833333 1/26/09 8:45,Product1,1200,Visa,Paula,Larchmont ,NY,United States,2/15/06 17:21,2/11/09 17:12,40.92778,-73.75222 1/23/09 10:45,Product1,1200,Visa,Stephanie,Saint Charles ,IL,United States,1/23/09 8:46,2/11/09 17:57,41.91417,-88.30861 1/28/09 8:50,Product1,1200,Visa,kemp,Brentwood ,TN,United States,1/28/09 8:42,2/11/09 18:41,36.03306,-86.78278 1/15/09 19:10,Product2,3600,Diners,Therese,Pensacola ,FL,United States,12/29/05 21:33,2/11/09 18:53,30.42111,-87.21694 1/9/09 20:25,Product1,1200,Diners,Mona,Kelowna,British Columbia,Canada,1/9/09 14:20,2/11/09 20:19,49.9,-119.4833333 1/15/09 21:53,Product1,1200,Visa,Caroline,Toronto,Ontario,Canada,1/1/09 18:01,2/11/09 21:01,43.6666667,-79.4166667 1/12/09 0:17,Product1,1200,Mastercard,Andrea,Brondby Strand,Kobenhavn,Denmark,1/7/09 23:40,2/11/09 22:23,55.6166667,12.35 1/25/09 10:32,Product1,1200,Mastercard,Pilar,Florence,Tuscany,Italy,1/23/09 4:46,2/12/09 2:22,43.7666667,11.25 1/12/09 23:35,Product1,1200,Visa,Lisa,Perth,Western Australia,Australia,5/8/06 23:41,2/12/09 3:46,-31.9333333,115.8333333 1/11/09 6:09,Product1,1200,Amex,A,Saint Petersburg ,FL,United States,11/8/08 4:07,2/12/09 4:41,27.77056,-82.67944 1/3/09 13:35,Product1,1200,Mastercard,Yvette,Aubonne,Vaud,Switzerland,8/15/08 4:02,2/12/09 5:17,46.4833333,6.4 1/18/09 11:03,Product2,3600,Amex,Katie,Gava,Catalonia,Spain,1/18/09 6:16,2/12/09 7:35,41.3,2.0166667 1/5/09 18:55,Product1,1200,Visa,Nicole,Mc Lean ,VA,United States,4/3/08 16:57,2/12/09 10:25,38.94222,-77.1825 1/2/09 18:54,Product1,1200,Mastercard,Kelly,Hendersonville ,TN,United States,12/7/08 4:51,2/12/09 11:31,36.30472,-86.62 1/13/09 14:44,Product2,3600,Visa,george,Zurich,Zurich,Switzerland,12/14/08 10:19,2/12/09 12:08,47.3666667,8.55 1/4/09 4:05,Product1,1200,Mastercard,Samantha,Watford,England,United Kingdom,12/31/08 8:33,2/12/09 12:29,51.6666667,-0.4 1/27/09 12:47,Product1,1200,Visa,Caterina,Amsterdam,Noord-Holland,Netherlands,1/27/09 12:03,2/12/09 12:59,52.35,4.9166667 1/22/09 6:51,Product1,1200,Visa,Kate,Rochester Hills ,MI,United States,1/22/09 5:54,2/12/09 13:01,42.68056,-83.13389 1/1/09 21:40,Product1,1200,Mastercard,Tina,Anglesea,Victoria,Australia,10/20/08 18:27,2/12/09 14:58,-38.4166667,144.1666667 1/27/09 18:06,Product1,1200,Visa,Emily,Killarney,New Providence,The Bahamas,1/13/09 18:22,2/12/09 19:28,25.05,-77.4166667 1/10/09 14:59,Product1,1200,Amex,Maricel,Malibu ,CA,United States,1/10/09 14:47,2/12/09 19:39,34.005,-118.80917 1/26/09 15:42,Product1,1200,Visa,Patricia,Allen ,TX,United States,1/26/09 14:38,2/12/09 22:41,33.10306,-96.67028 1/12/09 14:37,Product1,1200,Mastercard,steve,Evires,Rhone-Alpes,France,1/12/09 7:47,2/12/09 23:49,46.0333333,6.2333333 1/16/09 7:58,Product1,1200,Amex,Darrah,Den Haag,Zuid-Holland,Netherlands,9/30/07 4:03,2/13/09 3:05,52.0833333,4.3 1/22/09 14:32,Product1,1200,Visa,Sara,Perth City,Western Australia,Australia,9/5/08 7:18,2/13/09 3:50,-31.9333333,115.8333333 1/19/09 6:50,Product1,1200,Visa,Erika,Redruth,England,United Kingdom,1/6/09 13:29,2/13/09 4:27,50.2333333,-5.2333333 1/24/09 11:54,Product1,1200,Visa,Audrey,Bruxelles,Brussels (Bruxelles),Belgium,1/24/09 10:47,2/13/09 6:39,50.8333333,4.3333333 1/13/09 13:36,Product1,1200,Visa,Louise,London,England,United Kingdom,5/16/06 9:10,2/13/09 6:41,51.52721,0.14559 1/13/09 11:56,Product1,1200,Diners,Karen,Montreal,Quebec,Canada,10/31/08 12:37,2/13/09 8:18,45.5,-73.5833333 1/19/09 7:49,Product1,1200,Amex,Maki,Miami Beach ,FL,United States,1/18/09 15:26,2/13/09 12:26,25.79028,-80.13028 1/10/09 7:37,Product1,1200,Visa,Peter,Shankill,Dublin,Ireland,10/11/08 3:19,2/13/09 13:32,53.2261111,-6.1244444 1/20/09 5:53,Product1,1200,Diners,Ashlee,Oxford,England,United Kingdom,1/14/09 4:35,2/13/09 14:15,51.75,-1.25 1/6/09 10:34,Product1,1200,Mastercard,Anja,New York ,NY,United States,1/6/09 10:03,2/13/09 14:41,40.71417,-74.00639 1/23/09 5:14,Product1,1200,Visa,Ellen Walton ,Melbourne,Victoria,Australia,12/16/07 17:05,2/13/09 15:28,-37.8166667,144.9666667 1/14/09 16:02,Product1,1200,Mastercard,Jessica,Woodland Hills ,CA,United States,1/14/09 14:53,2/13/09 16:45,34.16833,-118.605 1/14/09 18:05,Product1,1200,Visa,Wouter and Andrea,Anchorage ,AK,United States,1/10/09 3:19,2/13/09 17:22,61.21806,-149.90028 1/8/09 20:52,Product1,1200,Visa,Pam and Rob,Yorba Linda ,CA,United States,11/18/08 20:03,2/13/09 19:32,33.88861,-117.81222 1/7/09 13:57,Product1,1200,Visa,Elsa,Waiwera,Auckland,New Zealand,1/7/09 13:32,2/13/09 19:54,-36.55,174.7166667 1/25/09 10:34,Product1,1200,Amex,kathleen kane,Jamaica Plain ,MA,United States,1/19/09 19:01,2/13/09 20:20,42.30972,-71.12083 1/28/09 4:35,Product1,1200,Diners,Selene,Oslo,Oslo,Norway,4/5/05 5:30,2/13/09 23:15,59.9166667,10.75 1/19/09 3:25,Product1,1200,Visa,Christy,Setagaya,Tokyo,Japan,1/10/06 4:49,2/14/09 1:03,35.6333333,139.65 1/18/09 0:41,Product2,3600,Visa,Hanna Agla,Donauworth,Bayern,Germany,9/21/06 23:27,2/14/09 1:11,48.7,10.8 1/27/09 2:38,Product1,1200,Visa,Elyse,Bandon,Cork,Ireland,11/30/07 9:25,2/14/09 3:36,51.7469444,-8.7425 1/16/09 6:04,Product1,1200,Mastercard,Alexis,Ehingen an der Donau,Baden-Wurttemberg,Germany,1/15/09 2:56,2/14/09 5:05,48.2833333,9.7333333 1/5/09 5:30,Product1,1200,Visa,M George,Paris,Ile-de-France,France,1/5/09 4:11,2/14/09 5:34,48.8666667,2.3333333 1/9/09 14:55,Product1,1200,Visa,John,Banbury,England,United Kingdom,1/8/09 16:23,2/14/09 7:27,52.05,-1.3333333 1/29/09 10:07,Product1,1200,Visa,cheryl,Beverly Hills ,CA,United States,1/27/09 8:42,2/14/09 10:01,34.07361,-118.39944 1/27/09 3:55,Product1,1200,Amex,R,Danderyd,Stockholm,Sweden,9/13/06 10:09,2/14/09 10:37,59.4166667,18.0166667 1/25/09 12:35,Product2,3600,Visa,Charlene ,Sebastopol ,CA,United States,1/25/09 10:42,2/14/09 10:40,38.40222,-122.82278 1/3/09 16:56,Product1,1200,Visa,Cindy,Glendora ,CA,United States,3/13/04 14:09,2/14/09 11:23,34.13611,-117.86444 1/12/09 12:04,Product1,1200,Visa,Ed,Nacka,Stockholm,Sweden,12/5/07 12:48,2/14/09 12:32,59.3,18.1666667 1/27/09 3:19,Product1,1200,Mastercard,Astrid,Canterbury,England,United Kingdom,1/27/09 1:01,2/14/09 13:35,51.2666667,1.0833333 1/24/09 9:30,Product1,1200,Visa,Nicole,Neuchatel,Neuchatel,Switzerland,1/24/09 5:24,2/14/09 13:45,47,6.9666667 1/25/09 18:33,Product1,1200,Visa,Maria Macarena,Billings ,MT,United States,1/23/09 9:35,2/14/09 16:27,45.78333,-108.5 1/15/09 11:43,Product1,1200,Visa,Maggie,Libertyville ,IL,United States,10/24/08 19:02,2/14/09 17:43,42.28306,-87.95306 1/23/09 16:30,Product2,3600,Amex,Christophe,Temecula ,CA,United States,1/9/09 15:59,2/14/09 19:11,33.49361,-117.1475 1/5/09 12:57,Product1,1200,Diners,Manoj,Boise ,ID,United States,1/5/09 9:32,2/14/09 19:19,43.61361,-116.2025 1/29/09 16:52,Product1,1200,Visa,Brenda,Rock Hill ,SC,United States,1/25/09 12:00,2/14/09 19:34,34.92472,-81.02528 1/10/09 0:04,Product1,1200,Mastercard,Lizelle ,Mililani ,HI,United States,1/9/09 23:37,2/14/09 19:34,21.42556,-157.96083 1/3/09 14:17,Product2,3600,Visa,Kees en Valesca,Scamander,Tasmania,Australia,1/3/09 13:53,2/14/09 20:11,-41.465,148.2572222 1/15/09 9:00,Product1,1200,Visa,Cormac,Freeport City,Freeport,The Bahamas,1/15/09 8:10,2/14/09 20:36,26.5333333,-78.7 1/24/09 20:58,Product1,1200,Visa,jacqueline,North Vancouver,British Columbia,Canada,12/28/08 15:54,2/14/09 22:12,49.3166667,-123.0666667 1/10/09 11:53,Product1,1200,Visa,Martin,Ludwigsburg,Baden-Wurttemberg,Germany,1/17/08 8:20,2/15/09 1:42,48.9,9.1833333 1/4/09 17:34,Product1,1200,Mastercard,Dean,Rockingham,Western Australia,Australia,10/20/07 19:09,2/15/09 2:14,-32.2833333,115.7166667 1/28/09 0:22,Product1,1200,Visa,VERBENA,Basel,Basel-Town,Switzerland,9/27/08 0:24,2/15/09 3:20,47.5666667,7.6 1/17/09 1:49,Product1,1200,Mastercard,Angel Marie,Den Haag,Zuid-Holland,Netherlands,1/13/09 5:09,2/15/09 5:19,52.0833333,4.3 1/25/09 17:48,Product1,1200,Visa,olla,Westminster ,CO,United States,1/24/09 23:48,2/15/09 8:08,39.83667,-105.03667 1/22/09 5:39,Product2,3600,Visa,Eman,Penclawdd,Wales,United Kingdom,1/14/09 13:33,2/15/09 8:34,51.6333333,-4.1 1/19/09 15:40,Product2,3600,Visa,Julia,Ede,Gelderland,Netherlands,1/19/09 14:32,2/15/09 10:33,52.0333333,5.6666667 1/21/09 23:52,Product1,1200,Visa,Sarah,Plan-les-Ouattes,Geneve,Switzerland,11/23/08 4:51,2/15/09 11:16,46.1666667,6.1166667 1/19/09 13:15,Product1,1200,Visa,Esther,Stocksund,Stockholm,Sweden,5/29/07 1:32,2/15/09 11:39,59.3833333,18.0666667 1/16/09 7:35,Product1,1200,Diners,amy,Stuttgart,Baden-Wurttemberg,Germany,10/6/06 2:02,2/15/09 12:00,48.7666667,9.1833333 1/22/09 9:48,Product2,3600,Mastercard,Jyoti,Tunbridge Wells,England,United Kingdom,1/8/08 14:37,2/15/09 13:36,51.1333333,0.2833333 1/18/09 12:05,Product2,3600,Visa,Keri,Issaquah ,WA,United States,1/5/09 19:24,2/15/09 13:40,47.53028,-122.03139 1/4/09 10:44,Product1,1200,Diners,Paul,Burnaby,British Columbia,Canada,11/26/08 20:16,2/15/09 13:46,49.25,-122.95 1/20/09 14:55,Product1,1200,Mastercard,Attie,Cypress ,CA,United States,9/27/08 7:22,2/15/09 15:23,33.81694,-118.03639 1/2/09 18:41,Product1,1200,Visa,odile,Lititz ,PA,United States,2/1/06 8:47,2/15/09 15:47,40.15722,-76.30722 1/2/09 7:03,Product1,1200,Visa,gail ,London,England,United Kingdom,5/24/08 11:10,2/15/09 16:04,51.52721,0.14559 1/21/09 7:19,Product1,1200,Visa,Niki,Chadds Ford ,PA,United States,3/5/08 11:25,2/15/09 16:06,39.87167,-75.59167 1/11/09 17:52,Product2,3600,Visa,Danny,St Thomas ,VI,United States,9/17/03 11:57,2/15/09 18:08,18.35917,-64.92111 1/16/09 17:56,Product1,1200,Mastercard,Sarah,Coppell ,TX,United States,1/16/09 12:57,2/15/09 20:13,32.95444,-97.01472 1/9/09 20:00,Product1,1200,Visa,Beckie ,Ladera Ranch ,CA,United States,1/6/09 13:50,2/15/09 23:10,33.57056,-117.63861 1/13/09 2:47,Product1,1200,Visa,Maryse,Rathfarnham,Dublin,Ireland,1/13/09 2:35,2/16/09 0:09,53.3005556,-6.2827778 1/19/09 4:23,Product2,3600,Mastercard,don,Cagliari,Sardinia,Italy,1/13/08 11:41,2/16/09 0:22,39.2166667,9.1166667 1/13/09 12:51,Product1,1200,Visa,Majken,Charlottenlund,Kobenhavn,Denmark,5/27/08 18:51,2/16/09 1:05,55.75,12.5833333 1/29/09 7:40,Product1,1200,Amex,Karen and Andrew,Munchen,Bayern,Germany,7/29/03 9:23,2/16/09 2:39,49.55,11.5833333 1/21/09 4:34,Product1,1200,Visa,Katerina,Firenze,Tuscany,Italy,4/24/08 0:57,2/16/09 3:45,43.7666667,11.25 1/7/09 13:28,Product1,1200,Mastercard,Mary,Baile Atha Bui,Meath,Ireland,9/21/05 15:42,2/16/09 3:51,53.6186111,-6.9205556 1/26/09 16:47,Product1,1200,Visa,Oscar,Chamonix-Mont-Blanc,Rhone-Alpes,France,1/26/09 4:53,2/16/09 5:01,45.9166667,6.8666667 1/29/09 1:01,Product1,1200,Diners,Suejean,Gingins,Vaud,Switzerland,1/20/09 6:14,2/16/09 5:09,46.4,6.1833333 1/25/09 12:55,Product1,1200,Amex,ann,Boca Raton ,FL,United States,12/6/08 15:26,2/16/09 6:54,26.35833,-80.08333 1/24/09 13:35,Product1,1200,Visa,Renee,Chaska ,MN,United States,5/11/06 13:27,2/16/09 9:00,44.78944,-93.60194 1/28/09 13:30,Product1,1200,Visa,Catherine,Hghlnds Ranch ,CO,United States,1/28/09 13:03,2/16/09 9:13,39.61333,-105.01611 1/20/09 19:08,Product1,1200,Amex,Rhonda,Atlanta ,GA,United States,11/21/08 5:52,2/16/09 10:08,33.74889,-84.38806 1/29/09 17:13,Product1,1200,Amex,alix,Tenafly ,NJ,United States,12/12/07 12:26,2/16/09 10:19,40.92528,-73.96333 1/2/09 5:33,Product1,1200,Visa,Mike,Aberdeen,Scotland,United Kingdom,10/18/04 4:53,2/16/09 11:12,57.1333333,-2.1 1/31/09 11:03,Product1,1200,Visa,Diane,Djurgarden,Stockholm,Sweden,1/25/09 3:48,2/16/09 12:08,59.3166667,18.1166667 1/13/09 9:16,Product1,1200,Visa,Sigrun,Nashville ,TN,United States,1/12/09 20:48,2/16/09 12:33,36.16583,-86.78444 1/19/09 12:38,Product1,1200,Visa,Dania,Munich,Bayern,Germany,1/19/09 11:47,2/16/09 12:46,48.15,11.5833333 1/18/09 12:14,Product2,3600,Mastercard,Kelsi,Utrecht,Utrecht,Netherlands,12/12/08 3:30,2/16/09 12:49,52.0833333,5.1333333 1/22/09 10:59,Product1,1200,Visa,Maria,Boyceville ,WI,United States,1/2/09 14:09,2/16/09 14:50,45.04361,-92.04083 1/14/09 7:30,Product1,1200,Visa,Bent Erik,Basauri,Pais Vasco,Spain,2/3/08 2:56,2/16/09 15:04,43.0166667,-2.4 1/19/09 1:52,Product1,1200,Amex,Kirsten,Melbourne,Victoria,Australia,4/24/07 4:36,2/17/09 1:20,-37.8166667,144.9666667 1/8/09 23:00,Product1,1200,Visa,Dickson,Kemerburgaz,Istanbul,Turkey,9/16/08 2:07,2/17/09 1:29,41.1594444,28.9127778 1/25/09 7:29,Product1,1200,Diners,Howard,Worcester,England,United Kingdom,1/22/09 14:02,2/17/09 3:00,52.2,-2.2 1/17/09 15:19,Product1,1200,Visa,Dana,Thurles,Tipperary,Ireland,1/15/09 9:13,2/17/09 3:26,52.6819444,-7.8022222 1/23/09 12:23,Product1,1200,Mastercard,Nola,Den Haag,Zuid-Holland,Netherlands,1/23/09 11:11,2/17/09 3:35,52.0833333,4.3 1/24/09 8:45,Product1,1200,Visa,Elizabeth,Cos Cob ,CT,United States,11/8/08 14:45,2/17/09 3:40,41.03333,-73.6 1/27/09 3:45,Product2,3600,Visa,minjeong,Bern,Bern,Switzerland,1/27/09 2:39,2/17/09 3:44,46.9166667,7.4666667 1/29/09 23:48,Product1,1200,Visa,Matt,Leicester,England,United Kingdom,11/15/08 6:49,2/17/09 5:47,52.6333333,-1.1333333 1/3/09 18:43,Product1,1200,Visa,Vanessa,Cornwall,Ontario,Canada,7/3/06 8:36,2/17/09 6:17,45.0166667,-74.7333333 1/24/09 17:18,Product2,3600,Visa,Charlotte,Sterling ,VA,United States,2/15/08 15:34,2/17/09 6:26,39.00611,-77.42889 1/2/09 15:13,Product1,1200,Visa,Rowena,Cork,Cork,Ireland,1/10/06 7:05,2/17/09 6:38,51.8986111,-8.4958333 1/8/09 10:44,Product1,1200,Visa,Catherine,Mount Forest,Ontario,Canada,1/6/09 13:03,2/17/09 6:39,43.9666667,-80.7333333 1/29/09 8:13,Product1,1200,Mastercard,Sarah,Ridgefield ,CT,United States,1/28/08 13:55,2/17/09 7:55,41.28139,-73.49861 1/24/09 10:26,Product1,1200,Visa,sorcha,Porto Alegre,Rio Grande do Sul,Brazil,1/24/09 4:47,2/17/09 8:05,-30.0333333,-51.2 1/24/09 12:56,Product1,1200,Visa,sorcha,Cartierville,Quebec,Canada,1/12/09 21:34,2/17/09 9:19,45.5333333,-73.7166667 1/7/09 13:38,Product1,1200,Mastercard,Mary,Stuttgart,Baden-Wurttemberg,Germany,1/6/09 13:40,2/17/09 9:32,48.7666667,9.1833333 1/23/09 15:38,Product1,1200,Visa,Ronja,Manhattan ,NY,United States,1/17/09 15:05,2/17/09 10:58,40.71417,-74.00639 1/26/09 14:43,Product1,1200,Visa,Nicola ,Sneem,Kerry,Ireland,1/26/09 13:55,2/17/09 11:07,51.8333333,-9.9 1/17/09 20:33,Product1,1200,Amex,BURCAK,Alpharetta ,GA,United States,1/9/09 11:26,2/17/09 12:31,34.07528,-84.29417 1/5/09 9:15,Product1,1200,Visa,isabelle,Sainte-Therese-de-Blainville,Quebec,Canada,8/21/08 9:43,2/17/09 12:34,45.6333333,-73.85 1/20/09 8:16,Product1,1200,Mastercard,christy,Germantown ,TN,United States,1/6/09 8:33,2/17/09 13:01,35.08667,-89.81 1/29/09 12:46,Product1,1200,Visa,Lilly,Castleknock,Dublin,Ireland,1/19/09 16:00,2/17/09 14:06,53.3786111,-6.3922222 1/15/09 18:12,Product1,1200,Diners,Mandy,Hono ,HI,United States,1/29/07 13:21,2/17/09 14:17,21.30694,-157.85833 1/23/09 13:55,Product1,1200,Mastercard,Elena,New Rochelle ,NY,United States,8/7/05 15:07,2/17/09 15:16,40.91139,-73.78278 1/26/09 10:26,Product1,1200,Visa,Lolarae,Calgary,Alberta,Canada,1/26/09 10:16,2/17/09 15:17,51.0833333,-114.0833333 1/12/09 11:48,Product1,1200,Mastercard,Lisa,South Waterford ,ME,United States,7/5/07 14:58,2/17/09 15:29,44.1786,-70.7164 1/29/09 15:20,Product1,1200,Mastercard,Nita and Trebor,Washington Township ,OH,United States,1/18/09 20:47,2/17/09 16:29,39.75889,-84.19167 1/28/09 7:26,Product1,1200,Visa,Jenevieve,Guelph,Ontario,Canada,1/23/09 19:04,2/17/09 18:08,43.55,-80.25 1/14/09 0:03,Product2,3600,Mastercard,Piret,Bunbury,Western Australia,Australia,6/16/08 18:22,2/17/09 19:31,-33.3333333,115.6333333 1/13/09 1:55,Product1,1200,Mastercard,Damian,Mettlach,Saarland,Germany,4/1/06 22:29,2/17/09 20:45,49.5,6.6 1/12/09 23:21,Product1,1200,Mastercard,Lusell,Oberwil,Basel-Country,Switzerland,1/6/09 2:47,2/17/09 22:57,47.5166667,7.55 1/22/09 2:16,Product1,1200,Visa,Costanza,Beykoz,Istanbul,Turkey,9/7/08 11:43,2/18/09 0:27,41.1438889,29.0905556 1/29/09 12:53,Product1,1200,Visa,Vanessa,Arc-et-Senans,Franche-Comte,France,1/29/09 10:10,2/18/09 1:03,47.0333333,5.7666667 1/28/09 11:36,Product1,1200,Diners,Evelyn,Grossbodungen,Thuringia,Germany,1/28/09 11:08,2/18/09 2:04,51.4666667,10.5 1/19/09 6:50,Product1,1200,Amex,Nicola,Bruxelles,Brussels (Bruxelles),Belgium,7/13/08 11:29,2/18/09 2:30,50.8333333,4.3333333 1/30/09 5:20,Product1,1200,Visa,Simone,Kilcornan,Limerick,Ireland,1/30/09 4:06,2/18/09 7:23,52.6166667,-8.8833333 1/19/09 14:06,Product1,1200,Mastercard,Elisabeth,Wilmington ,NC,United States,1/19/09 12:41,2/18/09 8:18,34.22556,-77.945 1/8/09 9:43,Product1,1200,Visa,Kasey,Aix-en-Provence,Provence-Alpes-Cote d'Azur,France,1/5/09 9:05,2/18/09 8:38,43.5333333,5.4333333 1/23/09 9:09,Product2,3600,Amex,Olympe,Lidingo,Stockholm,Sweden,1/18/06 11:49,2/18/09 8:45,59.3666667,18.1333333 1/20/09 8:58,Product1,1200,Visa,James,Edmonton,Alberta,Canada,12/24/08 17:51,2/18/09 9:42,53.55,-113.5 1/2/09 13:35,Product1,1200,Visa,Alyssa,Antibes,Provence-Alpes-Cote d'Azur,France,7/29/08 12:32,2/18/09 10:28,43.5833333,7.1166667 1/9/09 15:03,Product1,1200,Visa,Reto,Seattle ,WA,United States,1/8/09 18:59,2/18/09 15:51,47.60639,-122.33083 1/23/09 7:04,Product1,1200,Amex,Joelle,Rowayton ,CT,United States,1/20/09 10:46,2/18/09 16:55,41.1175,-73.40833 1/17/09 10:14,Product1,1200,Mastercard,Nicole,Simcoe,Ontario,Canada,1/17/09 7:46,2/18/09 18:49,42.8333333,-80.3 1/19/09 16:16,Product1,1200,Mastercard,Alexandria,Lebanon ,PA,United States,9/3/08 19:26,2/18/09 19:38,40.34083,-76.41167 1/20/09 13:54,Product1,1200,Mastercard,Elisabeth,Birkdale,Queensland,Australia,12/20/05 23:05,2/18/09 23:07,-27.4833333,153.2166667 1/23/09 21:35,Product1,1200,Visa,Ann,Brisbane,Queensland,Australia,4/21/07 19:33,2/18/09 23:12,-27.5,153.0166667 1/21/09 23:41,Product1,1200,Visa,Olga,Strasbourg,Alsace,France,2/4/08 4:45,2/19/09 0:09,48.5833333,7.75 1/21/09 4:11,Product1,1200,Visa,Courtney,Suchdol,Prague,Czech Republic,9/30/08 10:39,2/19/09 0:55,50.1333333,14.3833333 1/10/09 3:43,Product1,1200,Visa,stacy,Stuttgart,Baden-Wurttemberg,Germany,3/5/06 15:01,2/19/09 3:11,48.7666667,9.1833333 1/15/09 18:08,Product2,3600,Amex,Monica,Villanova ,PA,United States,1/12/09 17:16,2/19/09 3:19,40.03722,-75.34944 1/20/09 14:48,Product2,3600,Visa,Michael,Norrkoping,Ostergotland,Sweden,12/21/08 11:49,2/19/09 5:22,58.6,16.1833333 1/21/09 11:56,Product1,1200,Visa,Katrin,Zumikon,Zurich,Switzerland,3/21/06 13:30,2/19/09 7:05,47.3333333,8.6166667 1/30/09 6:18,Product2,3600,Mastercard,Louise,Balgach,St Gallen,Switzerland,1/14/06 2:40,2/19/09 7:10,47.4166667,9.6 1/12/09 17:28,Product1,1200,Amex,Alfredo A,Las Vegas ,NV,United States,12/3/08 14:12,2/19/09 8:09,36.175,-115.13639 1/29/09 8:27,Product2,3600,Visa,Kerry,Prague,Central Bohemia,Czech Republic,1/27/09 8:53,2/19/09 8:41,50.0833333,14.4666667 1/24/09 12:43,Product1,1200,Visa,Saeko ,Warwick ,NY,United States,2/2/08 16:37,2/19/09 10:28,41.25639,-74.36028 1/7/09 10:49,Product2,3600,Visa,VIOLETA,Silver Spring ,MD,United States,9/1/08 13:09,2/19/09 10:43,38.99056,-77.02639 1/11/09 17:06,Product1,1200,Visa,Antje,Sacramento ,CA,United States,9/17/08 15:12,2/19/09 12:05,38.58167,-121.49333 1/30/09 6:17,Product1,1200,Visa,janet,Blarney,Cork,Ireland,1/30/09 3:02,2/19/09 12:48,51.9333333,-8.5666667 1/7/09 10:52,Product1,1200,Visa,claire ,Ballyneety,Limerick,Ireland,1/7/09 9:42,2/19/09 14:32,52.5961111,-8.5469444 1/27/09 6:20,Product1,1200,Mastercard,Nathalie,Haymarket ,VA,United States,6/1/06 12:04,2/19/09 16:52,38.81194,-77.63667 1/21/09 20:02,Product1,1200,Mastercard,Daria,George Town, ,Cayman Isls,1/10/09 16:09,2/19/09 19:19,19.3,-81.3833333 1/4/09 16:23,Product1,1200,Visa,Judith L.,Scottsdale ,AZ,United States,1/4/09 16:04,2/19/09 19:35,33.50917,-111.89833 1/6/09 12:26,Product1,1200,Visa,Audinet,Cambridge ,MA,United States,1/6/09 8:40,2/19/09 19:44,42.375,-71.10611 1/11/09 4:34,Product1,1200,Visa,William,Chalfont Saint Peter,England,United Kingdom,4/26/06 10:12,2/19/09 21:38,51.6,-0.55 1/17/09 6:39,Product1,1200,Diners,Tatjana and Martin,Birmingham,England,United Kingdom,1/12/08 7:00,2/19/09 23:30,52.4666667,-1.9166667 1/4/09 3:41,Product1,1200,Mastercard,Scott,Den Haag,Zuid-Holland,Netherlands,1/4/05 12:43,2/20/09 0:24,52.0833333,4.3 1/12/09 5:50,Product3,7500,Mastercard,Brona,Den Haag,Zuid-Holland,Netherlands,1/4/05 12:43,2/20/09 0:24,52.0833333,4.3 1/3/09 13:43,Product1,1200,Mastercard,Andree,Newmarket,Cork,Ireland,10/22/06 14:59,2/20/09 3:18,52.2166667,-9 1/11/09 6:51,Product1,1200,Visa,Aziz,Irpin',Kiev,Ukraine,1/11/09 0:00,2/20/09 3:46,50.5166667,30.25 1/17/09 6:23,Product1,1200,Visa,Fernando,Grosseto,Tuscany,Italy,9/22/08 10:48,2/20/09 6:39,42.7666667,11.1333333 1/26/09 18:38,Product1,1200,Visa,Jo,Pembroke Pines ,FL,United States,10/26/08 4:24,2/20/09 8:09,26.01083,-80.14972 1/31/09 13:26,Product1,1200,Visa,Joern,Waterford,Ontario,Canada,12/13/08 18:12,2/20/09 8:27,42.9333333,-80.2833333 1/21/09 2:20,Product2,3600,Visa,Melissa,Carouge,Geneve,Switzerland,1/16/09 7:06,2/20/09 8:38,46.1833333,6.1333333 1/18/09 13:25,Product1,1200,Visa,Melissa,Chester ,CT,United States,1/15/09 11:57,2/20/09 10:08,41.40306,-72.45139 1/18/09 18:57,Product1,1200,Mastercard,isabela,Reston ,VA,United States,12/31/08 8:16,2/20/09 11:34,38.96861,-77.34139 1/31/09 1:59,Product1,1200,Visa,Nacole,Milan,Lombardy,Italy,4/11/05 2:40,2/20/09 11:41,45.4666667,9.2 1/25/09 16:08,Product1,1200,Diners,Jennifer,Vancouver,British Columbia,Canada,1/24/09 20:12,2/20/09 12:47,49.25,-123.1333333 1/16/09 19:13,Product1,1200,Diners,Mary,Alpharetta ,GA,United States,12/26/08 9:28,2/20/09 13:54,34.07528,-84.29417 1/31/09 15:25,Product1,1200,Visa,Lisa,Ringgold ,GA,United States,1/28/09 9:54,2/20/09 15:53,34.91583,-85.10917 1/9/09 8:57,Product1,1200,Diners,Debora ,Wall ,NJ,United States,1/21/08 10:27,2/20/09 16:45,40.1478,-74.2133 1/4/09 22:18,Product2,3600,Mastercard,Karoline ,Powell River,British Columbia,Canada,11/27/08 16:06,2/20/09 21:45,49.8833333,-124.55 1/10/09 15:18,Product2,3600,Mastercard,Jo ,Huntington Beach ,CA,United States,10/17/07 14:56,2/20/09 22:24,33.66028,-117.99833 1/16/09 19:47,Product1,1200,Amex,Kristen,Los Gatos ,CA,United States,1/13/09 20:49,2/20/09 23:09,37.22667,-121.97361 1/25/09 8:16,Product2,3600,Visa,Astrid,Oslo,Oslo,Norway,4/22/07 2:19,2/20/09 23:22,59.9166667,10.75 1/25/09 8:48,Product1,1200,Mastercard,Malinda,Oxford,England,United Kingdom,4/5/08 13:20,2/21/09 1:36,51.75,-1.25 1/17/09 9:12,Product1,1200,Amex,Sylvia,Alexandria ,VA,United States,12/26/06 14:23,2/21/09 4:50,38.80472,-77.04722 1/24/09 1:22,Product1,1200,Visa,Jupiterlina Elika,Rome,Lazio,Italy,10/19/04 2:38,2/21/09 6:04,41.9,12.4833333 1/27/09 15:09,Product1,1200,Visa,Aniko,Random Lake ,WI,United States,1/15/09 12:50,2/21/09 7:37,43.55222,-87.96167 1/25/09 21:49,Product1,1200,Mastercard,Petra,San Francisco ,CA,United States,1/24/09 1:35,2/21/09 9:26,37.775,-122.41833 1/24/09 8:51,Product1,1200,Mastercard,Heather,Baluan,General Santos,Philippines,1/19/09 11:08,2/21/09 10:08,6.1036111,125.2163889 1/6/09 14:08,Product1,1200,Mastercard,Kim,Brussels,Brussels (Bruxelles),Belgium,12/18/08 7:04,2/21/09 10:49,50.8333333,4.3333333 1/17/09 14:06,Product1,1200,Amex,Ruby,Bedford Corners ,NY,United States,11/28/04 18:58,2/21/09 13:03,41.20417,-73.7275 1/21/09 12:38,Product1,1200,Visa,Novy ,Istanbul,Istanbul,Turkey,2/5/07 12:43,2/21/09 13:55,41.0186111,28.9647222 1/30/09 23:49,Product2,3600,Visa,Stephanie,Hilversum,Noord-Holland,Netherlands,11/30/08 11:54,2/21/09 14:05,52.2333333,5.1833333 1/12/09 12:00,Product1,1200,Mastercard,Tammy,Milford ,ME,United States,7/6/08 8:49,2/21/09 18:45,44.94611,-68.64444 1/29/09 21:40,Product1,1200,Visa,Alessandra,Vancouver,British Columbia,Canada,6/17/08 19:23,2/21/09 20:32,49.25,-123.1333333 1/24/09 13:38,Product1,1200,Mastercard,Cathy,Kidderminster,England,United Kingdom,12/22/08 3:57,2/22/09 0:00,52.3833333,-2.25 1/25/09 13:50,Product2,3600,Visa,Scott,Lausanne,Vaud,Switzerland,1/25/09 10:09,2/22/09 3:33,46.5333333,6.6666667 1/12/09 13:41,Product1,1200,Amex,dia,Claygate,England,United Kingdom,8/19/07 15:23,2/22/09 3:51,51.35,-0.35 1/5/09 11:44,Product1,1200,Visa,Lauren,Laasby,Arhus,Denmark,11/19/08 3:55,2/22/09 6:15,56.15,9.8166667 1/2/09 8:31,Product1,1200,Visa,Line,Budaors,Pest,Hungary,10/23/08 8:15,2/22/09 7:06,47.45,18.9666667 1/31/09 7:13,Product1,1200,Amex,Sean,London,England,United Kingdom,1/3/08 14:59,2/22/09 7:12,51.52721,0.14559 1/20/09 2:17,Product1,1200,Diners,Sarah,Santo Domingo City,Distrito Nacional,Dominican Republic,11/9/08 1:26,2/22/09 11:21,18.4666667,-69.9 1/25/09 20:15,Product1,1200,Visa,Brian,Croton On Hudson ,NY,United States,1/23/09 22:33,2/22/09 11:51,41.2219,-73.887 1/25/09 19:44,Product1,1200,Mastercard,Lesa,Vespasiano,Minas Gerais,Brazil,1/6/05 21:17,2/22/09 14:24,-19.6666667,-43.9166667 1/30/09 9:00,Product1,1200,Mastercard,james,Nashville ,TN,United States,7/4/07 21:35,2/22/09 15:58,36.16583,-86.78444 1/7/09 19:18,Product1,1200,Mastercard,loudon,Ottawa,Ontario,Canada,11/2/07 20:26,2/22/09 16:06,45.4166667,-75.7 1/4/09 10:18,Product1,1200,Mastercard,Allison,Naples ,FL,United States,11/8/08 9:42,2/22/09 18:36,26.14167,-81.795 1/23/09 14:57,Product1,1200,Mastercard,Surat,Bridgewater ,NJ,United States,7/29/08 12:00,2/22/09 18:48,40.5945,-74.6244 1/12/09 10:08,Product2,3600,Mastercard,Judy,Washington ,DC,United States,5/31/08 12:03,2/22/09 18:58,38.895,-77.03667 1/19/09 4:22,Product1,1200,Diners,brian,Hagen,Lorraine,France,5/21/07 7:22,2/22/09 22:33,49.5,6.1666667 1/21/09 21:37,Product1,1200,Visa,Rachel,Taicheng,Guangdong,China,1/21/09 6:24,2/23/09 1:36,22.25,112.7833333 1/25/09 4:34,Product1,1200,Mastercard,Hilde,Groningen,Groningen,Netherlands,1/8/09 5:16,2/23/09 3:12,53.2166667,6.55 1/30/09 1:09,Product1,1200,Mastercard,Tarja,Villars,Vaud,Switzerland,11/30/08 4:39,2/23/09 3:56,46.3,7.05 1/26/09 15:16,Product1,1200,Visa,Megan,Huntersville ,NC,United States,12/22/08 20:09,2/23/09 5:14,35.41056,-80.84306 1/15/09 15:56,Product2,3600,Visa,Charmain,Cartersburg ,IN,United States,1/2/08 10:51,2/23/09 6:24,39.69861,-86.46361 1/2/09 20:47,Product1,1200,Visa,Katharina,Flower Mound ,TX,United States,9/23/08 20:57,2/23/09 6:56,33.01444,-97.09667 1/25/09 9:36,Product1,1200,Visa,Zaneta ,Rochester ,MI,United States,1/24/09 10:36,2/23/09 6:58,42.68056,-83.13389 1/20/09 20:09,Product1,1200,Visa,Jeannette,Dubai,Dubayy,United Arab Emirates,1/18/09 9:58,2/23/09 7:01,25.2522222,55.28 1/8/09 11:14,Product2,3600,Visa,Liz,Langnau,Zurich,Switzerland,1/7/09 10:25,2/23/09 7:17,47.2833333,8.5333333 1/6/09 20:39,Product2,3600,Mastercard,Christiane,Mission,British Columbia,Canada,1/6/09 9:44,2/23/09 8:55,49.1333333,-122.3 1/6/09 18:10,Product1,1200,Visa,Cherie,Columbus ,OH,United States,12/22/08 14:12,2/23/09 11:35,39.96111,-82.99889 1/11/09 6:46,Product2,3600,Visa,Shiree,Clondalkin,Dublin,Ireland,8/25/07 5:48,2/23/09 11:56,53.3244444,-6.3972222 1/19/09 14:26,Product1,1200,Mastercard,Tracey,Harold's Cross,Dublin,Ireland,1/6/09 13:24,2/23/09 12:02,53.3263889,-6.2947222 1/31/09 6:14,Product1,1200,Diners,Scott ,Sag Harbor ,NY,United States,6/27/08 4:15,2/23/09 13:36,40.99778,-72.29306 1/6/09 9:31,Product1,1200,Visa,Frances,San Diego ,CA,United States,1/4/09 3:18,2/23/09 15:39,32.71528,-117.15639 1/21/09 7:31,Product1,1200,Mastercard,Beatrice,Wilmington ,DE,United States,3/25/08 13:23,2/23/09 16:29,39.74583,-75.54694 1/20/09 17:23,Product2,3600,Visa,Jessica,Toronto,Ontario,Canada,1/20/08 18:01,2/23/09 19:35,43.6666667,-79.4166667 1/29/09 12:10,Product1,1200,Amex,Alison,Issaquah ,WA,United States,11/1/07 21:25,2/23/09 21:58,47.61056,-122.19944 1/24/09 23:21,Product1,1200,Visa,elaine,Phuket,Phuket,Thailand,1/24/09 22:47,2/24/09 1:12,7.8833333,98.4 1/28/09 10:37,Product1,1200,Visa,Chevonne,Athina,Attiki,Greece,5/8/08 4:26,2/24/09 2:58,37.9833333,23.7333333 1/30/09 14:36,Product1,1200,Visa,danielle,Geneve,Geneve,Switzerland,1/30/09 13:50,2/24/09 3:15,46.2,6.1666667 1/21/09 2:07,Product1,1200,Mastercard,Caroline and Jonathan,Chichester,England,United Kingdom,2/14/06 14:43,2/24/09 3:29,50.8333333,-0.7833333 1/26/09 6:37,Product1,1200,Visa,manuela,Massagno,Ticino,Switzerland,6/4/08 11:55,2/24/09 5:30,46.0166667,8.95 1/4/09 14:27,Product1,1200,Visa,Carole,Cardiff,Wales,United Kingdom,12/14/05 10:47,2/24/09 7:30,51.5,-3.2 1/9/09 3:03,Product2,3600,Amex,Ghislaine,Ferney-Voltaire,Rhone-Alpes,France,3/28/08 5:53,2/24/09 8:10,46.25,6.1166667 1/8/09 19:26,Product2,3600,Visa,Christian,Mableton ,GA,United States,11/30/07 10:44,2/24/09 8:22,33.81861,-84.5825 1/10/09 16:02,Product1,1200,Visa,Hollie,San Diego ,CA,United States,10/12/07 13:03,2/24/09 8:32,32.71528,-117.15639 1/6/09 6:31,Product1,1200,Visa,mike,La Louviere,Hainaut,Belgium,1/3/09 5:24,2/24/09 8:32,50.4666667,4.1833333 1/23/09 13:13,Product1,1200,Mastercard,Malahat,Minneapolis ,MN,United States,4/3/07 12:56,2/24/09 8:46,44.98,-93.26361 1/18/09 17:55,Product1,1200,Amex,Michaela,Mafra,Santa Catarina,Brazil,3/9/08 9:39,2/24/09 10:09,-26.1180556,-49.8016667 1/5/09 15:15,Product1,1200,Amex,Amy,Ashford,England,United Kingdom,8/18/05 2:04,2/24/09 10:35,51.1333333,0.8833333 1/2/09 10:32,Product1,1200,Mastercard,Brandi,Edmonton,Alberta,Canada,12/24/08 15:23,2/24/09 12:08,53.55,-113.5 1/25/09 9:27,Product1,1200,Visa,erin,London,England,United Kingdom,9/4/06 14:35,2/24/09 13:37,51.52721,0.14559 1/5/09 6:12,Product1,1200,Diners,Tracy,Lucca,Tuscany,Italy,1/4/09 6:19,2/24/09 13:56,43.8333333,10.4833333 1/6/09 2:41,Product1,1200,Visa,Polyxene,Perth,Western Australia,Australia,11/20/05 23:46,2/24/09 16:04,-31.9333333,115.8333333 1/27/09 14:42,Product2,3600,Mastercard,Jean,Arlington ,VA,United States,1/8/09 11:01,2/24/09 16:38,38.89028,-77.08444 1/8/09 12:03,Product1,1200,Diners,Andrea,Calgary,Alberta,Canada,8/13/08 15:58,2/24/09 17:41,51.0833333,-114.0833333 1/29/09 12:16,Product1,1200,Mastercard,Jessica,Chiefland ,FL,United States,1/27/09 15:56,2/24/09 18:29,29.47472,-82.86 1/19/09 10:47,Product1,1200,Mastercard,David,Stavenger,Rogaland,Norway,1/13/09 13:53,2/25/09 0:40,58.9666667,5.75 1/8/09 2:49,Product2,3600,Mastercard,Caroline,Begnins,Vaud,Switzerland,1/7/09 4:14,2/25/09 1:37,46.4333333,6.25 1/19/09 17:40,Product1,1200,Visa,Riche Lou,Newton ,MA,United States,3/12/07 7:21,2/25/09 2:28,42.33694,-71.20972 1/11/09 0:15,Product1,1200,Mastercard,Chris,Den Haag,Zuid-Holland,Netherlands,5/7/07 4:07,2/25/09 4:04,52.0833333,4.3 1/16/09 5:12,Product2,3600,Visa,Karen,Berikon,Aargau,Switzerland,10/19/07 12:31,2/25/09 5:12,47.35,8.3833333 1/19/09 6:52,Product1,1200,Diners,melanie,Santa Barbaraa,Heredia,Costa Rica,1/19/09 6:45,2/25/09 5:44,10.0333333,-84.15 1/26/09 1:14,Product1,1200,Visa,beatrice,Churra,Murcia,Spain,1/23/09 1:57,2/25/09 5:47,38.0166667,-1.1333333 1/30/09 10:31,Product1,1200,Mastercard,lorna,Castle Rock ,CO,United States,10/6/08 16:31,2/25/09 7:42,39.37222,-104.85556 1/23/09 5:52,Product1,1200,Amex,Tary,Zug,Zug,Switzerland,1/23/09 1:22,2/25/09 9:40,47.1666667,8.5166667 1/7/09 9:54,Product1,1200,Visa,Julie ,Ashford,England,United Kingdom,1/7/09 9:17,2/25/09 10:18,51.1,-4.1 1/1/09 16:44,Product1,1200,Amex,Julie ,Rockville ,MD,United States,9/12/08 10:36,2/25/09 10:48,39.08389,-77.15306 1/23/09 9:27,Product1,1200,Mastercard,Jerome,Madrid,Madrid,Spain,2/19/08 2:01,2/25/09 11:38,40.4,-3.6833333 1/22/09 12:56,Product1,1200,Visa,Laleh,Aasgaardstrand,Vestfold,Norway,1/20/09 13:13,2/25/09 12:03,59.3488889,10.4675 1/16/09 13:35,Product1,1200,Visa,Michael,Milano,Lombardy,Italy,1/16/09 12:43,2/25/09 13:59,45.4666667,9.2 1/13/09 9:26,Product1,1200,Visa,Kerry,Anieres,Geneve,Switzerland,1/24/06 13:15,2/25/09 14:05,46.2833333,6.2166667 1/25/09 11:35,Product3,7500,Mastercard,Anita,Fresno ,TX,United States,1/24/09 9:24,2/25/09 14:22,29.53861,-95.44722 1/26/09 14:02,Product1,1200,Mastercard,Veronique,Fresno ,TX,United States,1/24/09 9:24,2/25/09 14:22,29.53861,-95.44722 1/7/09 13:26,Product1,1200,Visa,Sarah,Warwick,Quebec,Canada,7/27/03 13:18,2/25/09 15:16,45.95,-71.9833333 1/15/09 11:45,Product1,1200,Diners,Simone,Watford,England,United Kingdom,9/4/08 3:01,2/25/09 15:21,51.6666667,-0.4 1/27/09 12:02,Product1,1200,Visa,Jackie,Waterford,Waterford,Ireland,3/10/08 13:51,2/25/09 15:41,52.2583333,-7.1119444 1/28/09 14:09,Product1,1200,Visa,giovanna,Pruszkow,Mazowieckie,Poland,1/28/09 13:40,2/25/09 16:19,52.1666667,20.8333333 1/23/09 7:13,Product1,1200,Visa,Elizabeth,Hamilton,Hamilton,Bermuda,1/19/09 6:03,2/25/09 16:20,32.2941667,-64.7838889 1/22/09 15:59,Product2,3600,Visa,Lisa,Ottawa,Ontario,Canada,1/21/09 9:28,2/25/09 17:15,45.4166667,-75.7 1/16/09 10:27,Product1,1200,Mastercard,Maki,Montgomery ,TX,United States,1/15/09 8:52,2/25/09 17:24,30.38806,-95.69611 1/26/09 22:45,Product1,1200,Amex,Anjan,Tokyo,Tokyo,Japan,5/15/08 19:33,2/25/09 17:34,35.685,139.7513889 1/25/09 18:33,Product1,1200,Mastercard,Sarah,Manteno ,IL,United States,1/25/09 15:56,2/25/09 19:27,41.25056,-87.83139 1/16/09 6:13,Product1,1200,Mastercard,Niamh,Benoni,Gauteng,South Africa,1/16/09 5:22,2/25/09 23:19,-26.1833333,28.3166667 1/12/09 17:19,Product2,3600,Diners,elizabeth r,Winter Haven ,FL,United States,1/12/09 16:18,2/26/09 0:42,28.02194,-81.73306 1/2/09 4:21,Product1,1200,Visa,Elaine,Tranby,Buskerud,Norway,7/30/07 11:42,2/26/09 3:18,59.8166667,10.25 1/5/09 3:03,Product1,1200,Diners,Elizabeth,Cork,Cork,Ireland,5/21/08 7:50,2/26/09 4:05,51.8986111,-8.4958333 1/15/09 15:22,Product1,1200,Visa,Sara,Fort Lauderdale ,FL,United States,1/6/09 18:19,2/26/09 5:52,26.12194,-80.14361 1/26/09 5:38,Product2,3600,Amex,Tulin,Cranberry Twp ,PA,United States,9/28/08 19:40,2/26/09 6:04,40.69472,-80.13111 1/24/09 10:38,Product1,1200,Visa,Kenneth,Arlington ,VA,United States,1/24/09 9:27,2/26/09 6:08,38.89028,-77.08444 1/2/09 7:30,Product1,1200,Mastercard,Fiona,Lake Ronkonkoma,NY,United States,10/27/08 0:00,2/26/09 6:14,40.835,-73.13167 1/26/09 6:38,Product1,1200,Visa,Christian,Alexandria ,VA,United States,1/25/09 10:13,2/26/09 7:16,38.80472,-77.04722 1/17/09 7:56,Product3,7500,Diners,Michel,Lipari,Sicilia,Italy,1/17/09 7:25,2/26/09 7:32,38.4666667,14.95 1/17/09 7:58,Product3,7500,Diners,natalie,Lipari,Sicilia,Italy,1/17/09 7:25,2/26/09 7:32,38.4666667,14.95 1/18/09 4:32,Product1,1200,Diners,jure,Lipari,Sicilia,Italy,1/17/09 7:25,2/26/09 7:32,38.4666667,14.95 1/26/09 8:00,Product1,1200,Amex,Elizabeth ,Bluffton ,SC,United States,1/23/09 11:12,2/26/09 7:49,32.23694,-80.86056 1/11/09 8:41,Product1,1200,Amex,Juliann,Winter Spgs ,FL,United States,1/8/08 7:24,2/26/09 8:17,28.69861,-81.30833 1/21/09 10:32,Product1,1200,Mastercard,Julie ,Chelmsford ,MA,United States,5/23/07 11:55,2/26/09 8:38,42.59972,-71.36778 1/29/09 12:27,Product1,1200,Mastercard,philippa katherine,Cabinteely,Dublin,Ireland,11/8/06 4:50,2/26/09 10:09,53.2594444,-6.1447222 1/13/09 13:19,Product2,3600,Mastercard,Anthony,Toronto,Ontario,Canada,3/16/06 19:11,2/26/09 11:19,43.6666667,-79.4166667 1/31/09 18:12,Product1,1200,Visa,matthew,Cincinnati ,OH,United States,4/2/06 11:49,2/26/09 12:03,39.16194,-84.45694 1/22/09 15:35,Product1,1200,Visa,Steven,Houston ,TX,United States,2/24/08 16:57,2/26/09 12:06,29.76306,-95.36306 1/5/09 11:24,Product1,1200,Amex,Angie,Rodeo ,CA,United States,1/25/08 16:50,2/26/09 12:15,38.01722,-122.2875 1/23/09 11:23,Product1,1200,Mastercard,Lauren,Poughkeepsie ,NY,United States,8/26/08 9:37,2/26/09 12:17,41.70028,-73.92139 1/7/09 20:55,Product1,1200,Mastercard,Esther,Cincinnati ,OH,United States,1/7/09 20:25,2/26/09 12:24,39.16194,-84.45694 1/13/09 9:40,Product1,1200,Visa,Elizabeth,North Eastham ,MA,United States,1/26/05 19:09,2/26/09 12:45,41.865,-69.99167 1/25/09 15:18,Product2,3600,Visa,marie-louise,Sitka ,AK,United States,3/2/08 15:27,2/26/09 12:58,57.05306,-135.33 1/30/09 20:58,Product2,3600,Mastercard,Tanya,Carcross,Yukon Territory,Canada,1/30/09 14:05,2/26/09 13:06,60.1833333,-134.7166667 1/31/09 4:50,Product1,1200,Mastercard,Detlev,Taby,Stockholm,Sweden,1/12/09 1:03,2/26/09 13:12,59.5,18.05 1/20/09 10:05,Product2,3600,Visa,Stephen,Calgary,Alberta,Canada,1/9/09 10:36,2/26/09 13:28,51.0833333,-114.0833333 1/9/09 5:15,Product1,1200,Visa,Roza,Alcobendas,Madrid,Spain,9/9/08 9:08,2/26/09 14:24,40.5333333,-3.6333333 1/13/09 7:09,Product2,3600,Amex,John,Chicago ,IL,United States,1/8/09 13:49,2/26/09 15:14,41.85,-87.65 1/3/09 11:03,Product1,1200,Mastercard,paula,Sammamish ,WA,United States,1/1/09 22:43,2/26/09 15:30,47.64194,-122.07917 1/17/09 20:51,Product1,1200,Visa,Kathryn,Waiau Pa,Auckland,New Zealand,1/6/09 21:52,2/26/09 16:19,-37.1333333,174.75 1/5/09 7:55,Product1,1200,Mastercard,Isabelle,Ewa Beach ,HI,United States,12/31/08 7:40,2/26/09 17:47,21.31556,-158.00722 1/25/09 14:40,Product1,1200,Visa,Maureen,Statesville ,NC,United States,1/25/09 13:52,2/26/09 18:38,35.7825,-80.8875 1/25/09 17:55,Product1,1200,Visa,David,Kapaa ,HI,United States,1/24/09 12:18,2/26/09 20:21,22.07833,-159.32194 1/3/09 12:54,Product1,1200,Diners,caterina,Burbank ,CA,United States,12/30/08 8:39,2/26/09 20:22,34.18083,-118.30806 1/22/09 3:57,Product2,3600,Mastercard,Parth,Oegstgeest,Zuid-Holland,Netherlands,1/20/09 14:36,2/27/09 1:59,52.1833333,4.4666667 1/23/09 5:11,Product1,1200,Visa,Alexia,Blackrock,Dublin,Ireland,7/15/08 7:20,2/27/09 4:00,53.3030556,-6.1830556 1/25/09 11:52,Product2,3600,Mastercard,Gloria Gail ,WalcProduct3ee,Tyrol,Austria,1/25/09 5:03,2/27/09 5:37,47.65,12.3166667 1/10/09 4:12,Product1,1200,Visa,Gloria Gail ,Foxrock,Dublin,Ireland,1/7/09 7:39,2/27/09 6:33,53.2666667,-6.1741667 1/10/09 9:32,Product2,3600,Mastercard,Cheryl,Hilton Head ,SC,United States,1/10/05 21:39,2/27/09 7:33,32.21611,-80.75278 1/22/09 12:45,Product3,7500,Visa,Frank and Christelle,Valley Center ,CA,United States,1/22/09 10:25,2/27/09 10:49,33.21833,-117.03333 1/6/09 18:11,Product2,3600,Mastercard,Triona,Swampscott ,MA,United States,6/9/06 8:57,2/27/09 13:00,42.47083,-70.91806 1/19/09 5:56,Product1,1200,Visa,Allison,Edinburgh,Scotland,United Kingdom,7/27/08 11:58,2/27/09 14:35,55.95,-3.2 1/25/09 10:50,Product1,1200,Diners,Phillip,San Antonio ,TX,United States,5/29/08 19:51,2/27/09 14:44,29.42389,-98.49333 1/14/09 8:38,Product1,1200,Visa,jingyan,Bristol ,RI,United States,3/12/07 15:14,2/27/09 17:13,41.67694,-71.26667 1/2/09 17:24,Product2,3600,Diners,clara,Perth,Western Australia,Australia,1/1/09 21:20,2/27/09 18:43,-31.9333333,115.8333333 1/7/09 18:15,Product1,1200,Mastercard,Selma,Greenville ,TX,United States,1/5/09 18:16,2/27/09 19:07,33.13833,-96.11056 1/3/09 21:19,Product1,1200,Visa,Doug and Tina,Pls Vrds Est ,CA,United States,12/24/07 22:59,2/27/09 21:40,33.80056,-118.38917 1/4/09 5:13,Product1,1200,Visa,Lauren,Hradec Kralove,East Bohemia,Czech Republic,3/5/06 0:51,2/27/09 23:30,50.2116667,15.8441667 1/4/09 9:28,Product1,1200,Visa,Jen,Maidstone,England,United Kingdom,7/18/05 14:17,2/28/09 2:28,51.2666667,0.5166667 1/2/09 4:34,Product1,1200,Visa,gladys,Saint Albans,England,United Kingdom,1/10/06 4:20,2/28/09 3:43,51.75,-0.3333333 1/22/09 11:10,Product1,1200,Mastercard,Gustavo,Voluntari,Bucuresti,Romania,7/28/08 11:12,2/28/09 7:52,44.4666667,26.1333333 1/7/09 12:06,Product1,1200,Visa,Erica,Nadur, ,Malta,3/30/06 2:02,2/28/09 7:59,36.0377778,14.2941667 1/29/09 13:25,Product1,1200,Diners,Hale,Morrison ,CO,United States,11/3/05 18:14,2/28/09 8:27,39.65361,-105.19056 1/27/09 2:57,Product1,1200,Visa,Rosemary,Cobham,England,United Kingdom,1/27/09 2:50,2/28/09 9:22,51.3833333,0.4 1/7/09 13:19,Product1,1200,Visa,Darian,Izmir,Izmir,Turkey,8/26/08 7:33,2/28/09 9:54,38.4072222,27.1502778 1/23/09 10:04,Product1,1200,Mastercard,Kevin,Hollywood ,CA,United States,5/30/06 20:25,2/28/09 9:59,34.09833,-118.32583 1/19/09 4:55,Product1,1200,Visa,Alyssa,Brighton,England,United Kingdom,2/19/08 9:27,2/28/09 10:06,50.8333333,-0.15 1/28/09 22:02,Product1,1200,Visa,Hale,Hawera,Taranaki,New Zealand,1/23/09 22:31,2/28/09 12:43,-39.5916667,174.2833333 1/4/09 18:57,Product1,1200,Mastercard,KELI,Worongary,Queensland,Australia,12/23/08 15:17,2/28/09 14:00,-28.05,153.35 1/12/09 20:31,Product1,1200,Visa,Glen,Atlantida,Guatemala,Guatemala,1/6/09 16:53,2/28/09 14:39,14.65,-90.4833333 1/24/09 12:00,Product1,1200,Visa,T,El Escorial,Madrid,Spain,12/30/08 15:19,2/28/09 15:17,40.5833333,-4.1166667 1/28/09 11:19,Product1,1200,Visa,christal,Morrison ,CO,United States,6/20/04 17:16,2/28/09 17:18,39.65361,-105.19056 1/7/09 17:48,Product1,1200,Mastercard,Alex,Augusta ,GA,United States,6/10/05 20:25,2/28/09 19:57,33.51722,-82.07583 1/23/09 12:42,Product2,3600,Mastercard,Anke,Avalon,New South Wales,Australia,3/3/08 17:38,2/28/09 22:26,-33.6333333,151.3333333 1/7/09 19:48,Product2,3600,Mastercard,TRICIA,Sydney,New South Wales,Australia,9/21/08 20:49,3/1/09 0:14,-33.8833333,151.2166667 1/26/09 11:19,Product1,1200,Mastercard,smith,Lahti,Etela-Suomen Laani,Finland,1/4/09 5:25,3/1/09 0:39,60.9666667,25.6666667 1/5/09 13:23,Product1,1200,Visa,Macy,Inner City,Vienna,Austria,1/5/09 11:28,3/1/09 2:28,48.2166667,16.3666667 1/26/09 13:41,Product1,1200,Mastercard,Lesleigh,Baden,Aargau,Switzerland,10/23/05 9:23,3/1/09 3:11,47.4666667,8.3 1/20/09 10:42,Product2,3600,Diners,esther,Huddersfield,England,United Kingdom,1/20/09 9:15,3/1/09 3:29,53.65,-1.7833333 1/22/09 14:25,Product1,1200,Visa,Hans-Joerg,Belfast,Northern Ireland,United Kingdom,11/10/08 12:15,3/1/09 3:37,54.5833333,-5.9333333 1/28/09 5:36,Product2,3600,Visa,Christiane,Black River,Black River,Mauritius,1/9/09 8:10,3/1/09 4:40,-20.3602778,57.3661111 1/1/09 4:24,Product3,7500,Amex,Pamela,Skaneateles ,NY,United States,12/28/08 17:28,3/1/09 7:21,42.94694,-76.42944 1/8/09 11:55,Product1,1200,Diners,julie,Haverhill,England,United Kingdom,11/29/06 13:31,3/1/09 7:28,52.0833333,0.4333333 1/12/09 21:30,Product1,1200,Visa,Julia ,Madison ,WI,United States,11/17/08 22:24,3/1/09 10:14,43.07306,-89.40111 --------------------------------------------------------------------------------