├── 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 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
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: 
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
--------------------------------------------------------------------------------