|  | #!/usr/bin/env python | 
|  | # | 
|  | # ===- csv2json.py - Static Analyzer test helper ---*- python -*-===# | 
|  | # | 
|  | # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | # See https://llvm.org/LICENSE.txt for license information. | 
|  | # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | # | 
|  | # ===------------------------------------------------------------------------===# | 
|  |  | 
|  | r""" | 
|  | Clang Static Analyzer test helper | 
|  | ================================= | 
|  |  | 
|  | This script converts a CSV file to a JSON file with a specific structure. | 
|  |  | 
|  | The JSON file contains a single dictionary.  The keys of this dictionary | 
|  | are taken from the first column of the CSV. The values are dictionaries | 
|  | themselves, mapping the CSV header names (except the first column) to | 
|  | the corresponding row values. | 
|  |  | 
|  |  | 
|  | Usage: | 
|  | csv2json.py <source-file> | 
|  |  | 
|  | Example: | 
|  | // RUN: %csv2json.py %t | FileCheck %s | 
|  | """ | 
|  |  | 
|  | import csv | 
|  | import sys | 
|  | import json | 
|  |  | 
|  |  | 
|  | def csv_to_json_dict(csv_filepath): | 
|  | """ | 
|  | Args: | 
|  | csv_filepath: The path to the input CSV file. | 
|  |  | 
|  | Raises: | 
|  | FileNotFoundError: If the CSV file does not exist. | 
|  | csv.Error: If there is an error parsing the CSV file. | 
|  | Exception: For any other unexpected errors. | 
|  | """ | 
|  | try: | 
|  | with open(csv_filepath, "r", encoding="utf-8") as csvfile: | 
|  | reader = csv.reader(csvfile) | 
|  |  | 
|  | # Read the header row (column names) | 
|  | try: | 
|  | header = next(reader) | 
|  | except StopIteration:  # Handle empty CSV file | 
|  | json.dumps({}, indent=2)  # write an empty dict | 
|  | return | 
|  |  | 
|  | # handle a csv file that contains no rows, not even a header row. | 
|  | if not header: | 
|  | json.dumps({}, indent=2) | 
|  | return | 
|  |  | 
|  | other_column_names = [name.strip() for name in header[1:]] | 
|  |  | 
|  | data_dict = {} | 
|  |  | 
|  | for row in reader: | 
|  | if len(row) != len(header): | 
|  | raise csv.Error("Inconsistent CSV file") | 
|  | exit(1) | 
|  |  | 
|  | key = row[0] | 
|  | value_map = {} | 
|  |  | 
|  | for i, col_name in enumerate(other_column_names): | 
|  | # +1 to skip the first column | 
|  | value_map[col_name] = row[i + 1].strip() | 
|  |  | 
|  | data_dict[key] = value_map | 
|  |  | 
|  | return json.dumps(data_dict, indent=2) | 
|  |  | 
|  | except FileNotFoundError: | 
|  | raise FileNotFoundError(f"Error: CSV file not found at {csv_filepath}") | 
|  | except csv.Error as e: | 
|  | raise csv.Error(f"Error parsing CSV file: {e}") | 
|  | except Exception as e: | 
|  | raise Exception(f"An unexpected error occurred: {e}") | 
|  |  | 
|  |  | 
|  | def main(): | 
|  | """Example usage with error handling.""" | 
|  | csv_file = sys.argv[1] | 
|  |  | 
|  | try: | 
|  | print(csv_to_json_dict(csv_file)) | 
|  | except (FileNotFoundError, csv.Error, Exception) as e: | 
|  | print(str(e)) | 
|  | except: | 
|  | print("An error occured") | 
|  |  | 
|  |  | 
|  | if __name__ == "__main__": | 
|  | main() |