首页 > 解决方案 > 带有 json 条目的 csv 解析

问题描述

我正在编写我的第一个 Haskell 程序,试图从文件中解析“csv”。到目前为止,我已经设法写了以下内容


{-#  LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE FlexibleInstances #-}

module Main where

import Lib
import System.IO
import Control.Applicative
import Control.Monad
import GHC.Generics (Generic)
import Data.Text    (Text)
import Text.Regex    (subRegex,mkRegex)
import qualified Data.Text  as Text
import qualified Data.ByteString    as BS
import qualified Data.Csv  as DC
-- import Data.Csv  (.!)
import qualified Data.Aeson  as DA
import qualified Data.Vector as V
import qualified Data.ByteString.Lazy.UTF8 as BLU -- from utf8-string
import qualified Data.ByteString.UTF8 as BU -- as toString :: ByteString -> String

testEmtecString = "2020-01-02 07:57:31+00,\"[{\"\"rpm\"\": 893, \"\"geom\"\": \"\"0101000020E6100000B554DE8E70DAE9BF6F9EEA909BE74940\"\", \"\"speed\"\": 46.670976, \"\"airflow\"\": 8.13, \"\"g_force\"\": 0, \"\"accuracy\"\": \"\"FixOk\"\", \"\"ignition\"\": 1, \"\"latitude\"\": 51.809435, \"\"odometer\"\": 4867, \"\"longitude\"\": -0.807915, \"\"speed_gps\"\": 0, \"\"trip_event\"\": null, \"\"gpsdatatime\"\": \"\"2020-01-02T07:57:31+00:00\"\", \"\"harsh_force\"\": 0.25, \"\"speed_miles\"\": 28.99999989558144, \"\"trip_number\"\": null, \"\"acceleration\"\": 0, \"\"braking_alarm\"\": false, \"\"fuel_consumed\"\": 22563, \"\"harsh_braking\"\": false, \"\"odometer_miles\"\": 3024.21358173, \"\"cornering_alarm\"\": null, \"\"harsh_cornering\"\": false, \"\"speed_gps_miles\"\": 0.0, \"\"throttle_position\"\": 14, \"\"acceleration_alarm\"\": false, \"\"harsh_acceleration\"\": true, \"\"coolant_temperature\"\": 29, \"\"intake_air_temperature\"\": 8, \"\"harsh_cornering_degrees\"\": 0, \"\"manifold_absolute_pressure\"\": 97}, {\"\"rpm\"\": 893, \"\"geom\"\": \"\"0101000020E610000047382D78D1D7E9BF61545227A0E74940\"\", \"\"speed\"\": 27.358848000000002, \"\"airflow\"\": 8.13, \"\"g_force\"\": 0.6795786612300374, \"\"accuracy\"\": \"\"FixOk\"\", \"\"ignition\"\": 1, \"\"latitude\"\": 51.809575, \"\"odometer\"\": 4867, \"\"longitude\"\": -0.807595, \"\"speed_gps\"\": 24, \"\"trip_event\"\": null, \"\"gpsdatatime\"\": \"\"2020-01-02T07:57:35+00:00\"\", \"\"harsh_force\"\": 0.25, \"\"speed_miles\"\": 16.99999993878912, \"\"trip_number\"\": null, \"\"acceleration\"\": 6.666666666666667, \"\"braking_alarm\"\": false, \"\"fuel_consumed\"\": 22563, \"\"harsh_braking\"\": false, \"\"odometer_miles\"\": 3024.21358173, \"\"cornering_alarm\"\": null, \"\"harsh_cornering\"\": false, \"\"speed_gps_miles\"\": 14.912908559999998, \"\"gps_braking_alarm\"\": true, \"\"throttle_position\"\": 14, \"\"acceleration_alarm\"\": false, \"\"harsh_acceleration\"\": true, \"\"coolant_temperature\"\": 29, \"\"gps_acceleration_alarm\"\": false, \"\"intake_air_temperature\"\": 8, \"\"harsh_cornering_degrees\"\": 0, \"\"manifold_absolute_pressure\"\": 97}, {\"\"rpm\"\": 1178, \"\"geom\"\": \"\"0101000020E61000000611A96917D3E9BF9E0B23BDA8E74940\"\", \"\"speed\"\": 46.670976, \"\"airflow\"\": 15.69, \"\"g_force\"\": -0.3397893306150187, \"\"accuracy\"\": \"\"FixOk\"\", \"\"ignition\"\": 1, \"\"latitude\"\": 51.809837, \"\"odometer\"\": 4867, \"\"longitude\"\": -0.807018, \"\"speed_gps\"\": 12, \"\"trip_event\"\": null, \"\"gpsdatatime\"\": \"\"2020-01-02T07:57:50+00:00\"\", \"\"harsh_force\"\": 0.25, \"\"speed_miles\"\": 28.99999989558144, \"\"trip_number\"\": null, \"\"acceleration\"\": -3.3333333333333335, \"\"braking_alarm\"\": false, \"\"fuel_consumed\"\": 22565, \"\"harsh_braking\"\": false, \"\"odometer_miles\"\": 3024.21358173, \"\"cornering_alarm\"\": null, \"\"harsh_cornering\"\": false, \"\"speed_gps_miles\"\": 7.456454279999999, \"\"gps_braking_alarm\"\": false, \"\"throttle_position\"\": 32, \"\"acceleration_alarm\"\": false, \"\"harsh_acceleration\"\": true, \"\"coolant_temperature\"\": 31, \"\"gps_acceleration_alarm\"\": false, \"\"intake_air_temperature\"\": 11, \"\"harsh_cornering_degrees\"\": 0, \"\"manifold_absolute_pressure\"\": 116}, {\"\"rpm\"\": 1400, \"\"geom\"\": \"\"0101000020E6100000ED116A8654D1E9BFE17F2BD9B1E74940\"\", \"\"speed\"\": 51.499008, \"\"airflow\"\": 21.97, \"\"g_force\"\": 0.5379997734737796, \"\"accuracy\"\": \"\"FixOk\"\", \"\"ignition\"\": 1, \"\"latitude\"\": 51.810115, \"\"odometer\"\": 4867, \"\"longitude\"\": -0.806803, \"\"speed_gps\"\": 31, \"\"trip_event\"\": null, \"\"gpsdatatime\"\": \"\"2020-01-02T07:57:54+00:00\"\", \"\"harsh_force\"\": 0.25, \"\"speed_miles\"\": 31.99999988477952, \"\"trip_number\"\": null, \"\"acceleration\"\": 5.277777777777778, \"\"braking_alarm\"\": false, \"\"fuel_consumed\"\": 22565, \"\"harsh_braking\"\": false, \"\"odometer_miles\"\": 3024.21358173, \"\"cornering_alarm\"\": null, \"\"harsh_cornering\"\": false, \"\"speed_gps_miles\"\": 19.262506889999997, \"\"gps_braking_alarm\"\": true, \"\"throttle_position\"\": 36, \"\"acceleration_alarm\"\": false, \"\"harsh_acceleration\"\": true, \"\"coolant_temperature\"\": 32, \"\"gps_acceleration_alarm\"\": false, \"\"intake_air_temperature\"\": 12, \"\"harsh_cornering_degrees\"\": 0, \"\"manifold_absolute_pressure\"\": 137}, {\"\"rpm\"\": 901, \"\"geom\"\": \"\"0101000020E61000002ECBD765F8CFE9BFF10D85CFD6E74940\"\", \"\"speed\"\": 35.405568, \"\"airflow\"\": 8.24, \"\"g_force\"\": -0.02831577755125156, \"\"accuracy\"\": \"\"FixOk\"\", \"\"ignition\"\": 1, \"\"latitude\"\": 51.811243, \"\"odometer\"\": 4868, \"\"longitude\"\": -0.806637, \"\"speed_gps\"\": 30, \"\"trip_event\"\": null, \"\"gpsdatatime\"\": \"\"2020-01-02T07:58:09+00:00\"\", \"\"harsh_force\"\": 0.25, \"\"speed_miles\"\": 21.99999992078592, \"\"trip_number\"\": null, \"\"acceleration\"\": -0.2777777777777778, \"\"braking_alarm\"\": false, \"\"fuel_consumed\"\": 22565, \"\"harsh_braking\"\": false, \"\"odometer_miles\"\": 3024.83495292, \"\"cornering_alarm\"\": null, \"\"harsh_cornering\"\": false, \"\"speed_gps_miles\"\": 18.6411357, \"\"gps_braking_alarm\"\": false, \"\"throttle_position\"\": 14, \"\"acceleration_alarm\"\": false, \"\"harsh_acceleration\"\": true, \"\"coolant_temperature\"\": 33, \"\"gps_acceleration_alarm\"\": false, \"\"intake_air_temperature\"\": 8, \"\"harsh_cornering_degrees\"\": 0, \"\"manifold_absolute_pressure\"\": 96}, {\"\"rpm\"\": 897, \"\"geom\"\": \"\"0101000020E6100000471FF30181CEE9BFEC504D49D6E74940\"\", \"\"speed\"\": 22.530816, \"\"airflow\"\": 8.13, \"\"g_force\"\": 0.42473666326877335, \"\"accuracy\"\": \"\"FixOk\"\", \"\"ignition\"\": 1, \"\"latitude\"\": 51.811227, \"\"odometer\"\": 4868, \"\"longitude\"\": -0.806458, \"\"speed_gps\"\": 45, \"\"trip_event\"\": null, \"\"gpsdatatime\"\": \"\"2020-01-02T07:58:10+00:00\"\", \"\"harsh_force\"\": 0.25, \"\"speed_miles\"\": 13.99999994959104, \"\"trip_number\"\": null, \"\"acceleration\"\": 4.166666666666667, \"\"braking_alarm\"\": false, \"\"fuel_consumed\"\": 22565, \"\"harsh_braking\"\": false, \"\"odometer_miles\"\": 3024.83495292, \"\"cornering_alarm\"\": null, \"\"harsh_cornering\"\": false, \"\"speed_gps_miles\"\": 27.96170355, \"\"gps_braking_alarm\"\": true, \"\"throttle_position\"\": 14, \"\"acceleration_alarm\"\": false, \"\"harsh_acceleration\"\": true, \"\"coolant_temperature\"\": 33, \"\"gps_acceleration_alarm\"\": false, \"\"intake_air_temperature\"\": 8, \"\"harsh_cornering_degrees\"\": 0, \"\"manifold_absolute_pressure\"\": 97}, {\"\"rpm\"\": 1589, \"\"geom\"\": \"\"0101000020E610000025917D9065C1E9BFE09C11A5BDE74940\"\", \"\"speed\"\": 64.37376, \"\"airflow\"\": 20.72, \"\"g_force\"\": -0.7928417714350436, \"\"accuracy\"\": \"\"FixOk\"\", \"\"ignition\"\": 1, \"\"latitude\"\": 51.810475, \"\"odometer\"\": 4868, \"\"longitude\"\": -0.804858, \"\"speed_gps\"\": 17, \"\"trip_event\"\": null, \"\"gpsdatatime\"\": \"\"2020-01-02T07:58:40+00:00\"\", \"\"harsh_force\"\": 0.25, \"\"speed_miles\"\": 39.9999998559744, \"\"trip_number\"\": null, \"\"acceleration\"\": -7.777777777777779, \"\"braking_alarm\"\": false, \"\"fuel_consumed\"\": 22568, \"\"harsh_braking\"\": false, \"\"odometer_miles\"\": 3024.83495292, \"\"cornering_alarm\"\": null, \"\"harsh_cornering\"\": false, \"\"speed_gps_miles\"\": 10.563310229999999, \"\"gps_braking_alarm\"\": false, \"\"throttle_position\"\": 33, \"\"acceleration_alarm\"\": false, \"\"harsh_acceleration\"\": true, \"\"coolant_temperature\"\": 36, \"\"gps_acceleration_alarm\"\": false, \"\"intake_air_temperature\"\": 11, \"\"harsh_cornering_degrees\"\": 0, \"\"manifold_absolute_pressure\"\": 131}, {\"\"rpm\"\": 259, \"\"geom\"\": \"\"0101000020E6100000AD307DAF21B8E9BF8CA03193A8E74940\"\", \"\"speed\"\": 22.530816, \"\"airflow\"\": 0.77, \"\"g_force\"\": 0.509683995922528, \"\"accuracy\"\": \"\"FixOk\"\", \"\"ignition\"\": 1, \"\"latitude\"\": 51.809832, \"\"odometer\"\": 4868, \"\"longitude\"\": -0.803727, \"\"speed_gps\"\": 35, \"\"trip_event\"\": null, \"\"gpsdatatime\"\": \"\"2020-01-02T07:58:51+00:00\"\", \"\"harsh_force\"\": 0.25, \"\"speed_miles\"\": 13.99999994959104, \"\"trip_number\"\": null, \"\"acceleration\"\": 5.0, \"\"braking_alarm\"\": false, \"\"fuel_consumed\"\": 22568, \"\"harsh_braking\"\": false, \"\"odometer_miles\"\": 3024.83495292, \"\"cornering_alarm\"\": null, \"\"harsh_cornering\"\": false, \"\"speed_gps_miles\"\": 21.74799165, \"\"gps_braking_alarm\"\": true, \"\"throttle_position\"\": 14, \"\"acceleration_alarm\"\": false, \"\"harsh_acceleration\"\": true, \"\"coolant_temperature\"\": 37, \"\"gps_acceleration_alarm\"\": false, \"\"intake_air_temperature\"\": 5, \"\"harsh_cornering_degrees\"\": 0, \"\"manifold_absolute_pressure\"\": 50}, {\"\"rpm\"\": 935, \"\"geom\"\": \"\"0101000020E61000009F1F46088FB6E9BF21EA3E00A9E74940\"\", \"\"speed\"\": 17.702784, \"\"airflow\"\": 7.8, \"\"g_force\"\": -0.7078944387812889, \"\"accuracy\"\": \"\"FixOk\"\", \"\"ignition\"\": 1, \"\"latitude\"\": 51.809845, \"\"odometer\"\": 4868, \"\"longitude\"\": -0.803535, \"\"speed_gps\"\": 10, \"\"trip_event\"\": null, \"\"gpsdatatime\"\": \"\"2020-01-02T07:58:56+00:00\"\", \"\"harsh_force\"\": 0.25, \"\"speed_miles\"\": 10.99999996039296, \"\"trip_number\"\": null, \"\"acceleration\"\": -6.944444444444445, \"\"braking_alarm\"\": false, \"\"fuel_consumed\"\": 22568, \"\"harsh_braking\"\": false, \"\"odometer_miles\"\": 3024.83495292, \"\"cornering_alarm\"\": null, \"\"harsh_cornering\"\": false, \"\"speed_gps_miles\"\": 6.2137119, \"\"gps_braking_alarm\"\": false, \"\"throttle_position\"\": 21, \"\"acceleration_alarm\"\": false, \"\"harsh_acceleration\"\": true, \"\"coolant_temperature\"\": 37, \"\"gps_acceleration_alarm\"\": false, \"\"intake_air_temperature\"\": 12, \"\"harsh_cornering_degrees\"\": 0, \"\"manifold_absolute_pressure\"\": 90}, {\"\"rpm\"\": 935, \"\"geom\"\": \"\"0101000020E610000002BB9A3C65B5E9BF9291B3B0A7E74940\"\", \"\"speed\"\": 12.874752, \"\"airflow\"\": 7.8, \"\"g_force\"\": -0.05663155510250312, \"\"accuracy\"\": \"\"FixOk\"\", \"\"ignition\"\": 1, \"\"latitude\"\": 51.809805, \"\"odometer\"\": 4868, \"\"longitude\"\": -0.803393, \"\"speed_gps\"\": 8, \"\"trip_event\"\": null, \"\"gpsdatatime\"\": \"\"2020-01-02T07:59:01+00:00\"\", \"\"harsh_force\"\": 0.25, \"\"speed_miles\"\": 7.99999997119488, \"\"trip_number\"\": null, \"\"acceleration\"\": -0.5555555555555556, \"\"braking_alarm\"\": false, \"\"fuel_consumed\"\": 22568, \"\"harsh_braking\"\": false, \"\"odometer_miles\"\": 3024.83495292, \"\"cornering_alarm\"\": null, \"\"harsh_cornering\"\": false, \"\"speed_gps_miles\"\": 4.97096952, \"\"gps_braking_alarm\"\": false, \"\"throttle_position\"\": 21, \"\"acceleration_alarm\"\": false, \"\"harsh_acceleration\"\": true, \"\"coolant_temperature\"\": 37, \"\"gps_acceleration_alarm\"\": false, \"\"intake_air_temperature\"\": 12, \"\"harsh_cornering_degrees\"\": 0, \"\"manifold_absolute_pressure\"\": 90}, {\"\"rpm\"\": 350, \"\"geom\"\": \"\"0101000020E61000003BA92F4B3BB5E9BFCEC3094CA7E74940\"\", \"\"speed\"\": 0.0, \"\"airflow\"\": 0.0, \"\"g_force\"\": -0.14157888775625777, \"\"accuracy\"\": \"\"FixOk\"\", \"\"ignition\"\": 1, \"\"latitude\"\": 51.809793, \"\"odometer\"\": 4868, \"\"longitude\"\": -0.803373, \"\"speed_gps\"\": 3, \"\"trip_event\"\": null, \"\"gpsdatatime\"\": \"\"2020-01-02T07:59:03+00:00\"\", \"\"harsh_force\"\": 0.25, \"\"speed_miles\"\": 0.0, \"\"trip_number\"\": null, \"\"acceleration\"\": -1.3888888888888888, \"\"braking_alarm\"\": false, \"\"fuel_consumed\"\": 22568, \"\"harsh_braking\"\": false, \"\"odometer_miles\"\": 3024.83495292, \"\"cornering_alarm\"\": null, \"\"harsh_cornering\"\": false, \"\"speed_gps_miles\"\": 1.8641135699999998, \"\"gps_braking_alarm\"\": false, \"\"throttle_position\"\": 14, \"\"acceleration_alarm\"\": false, \"\"harsh_acceleration\"\": true, \"\"coolant_temperature\"\": 38, \"\"gps_acceleration_alarm\"\": false, \"\"intake_air_temperature\"\": 10, \"\"harsh_cornering_degrees\"\": 0, \"\"manifold_absolute_pressure\"\": 36}, {\"\"rpm\"\": 350, \"\"geom\"\": \"\"0101000020E61000003BA92F4B3BB5E9BFCEC3094CA7E74940\"\", \"\"speed\"\": 0.0, \"\"airflow\"\": 0.0, \"\"g_force\"\": -0.08494733265375468, \"\"accuracy\"\": \"\"FixOk\"\", \"\"ignition\"\": 1, \"\"latitude\"\": 51.809793, \"\"odometer\"\": 4868, \"\"longitude\"\": -0.803373, \"\"speed_gps\"\": 0, \"\"trip_event\"\": null, \"\"gpsdatatime\"\": \"\"2020-01-02T07:59:07+00:00\"\", \"\"harsh_force\"\": 0.25, \"\"speed_miles\"\": 0.0, \"\"trip_number\"\": null, \"\"acceleration\"\": -0.8333333333333334, \"\"braking_alarm\"\": false, \"\"fuel_consumed\"\": 22569, \"\"harsh_braking\"\": false, \"\"odometer_miles\"\": 3024.83495292, \"\"cornering_alarm\"\": null, \"\"harsh_cornering\"\": false, \"\"speed_gps_miles\"\": 0.0, \"\"gps_braking_alarm\"\": false, \"\"throttle_position\"\": 14, \"\"acceleration_alarm\"\": false, \"\"harsh_acceleration\"\": true, \"\"coolant_temperature\"\": 38, \"\"gps_acceleration_alarm\"\": false, \"\"intake_air_temperature\"\": 10, \"\"harsh_cornering_degrees\"\": 0, \"\"manifold_absolute_pressure\"\": 36}, {\"\"rpm\"\": 350, \"\"geom\"\": \"\"0101000020E61000003BA92F4B3BB5E9BFCEC3094CA7E74940\"\", \"\"speed\"\": 0.0, \"\"airflow\"\": 0.0, \"\"g_force\"\": 0.0, \"\"accuracy\"\": \"\"FixOk\"\", \"\"ignition\"\": 1, \"\"latitude\"\": 51.809793, \"\"odometer\"\": 4868, \"\"longitude\"\": -0.803373, \"\"speed_gps\"\": 0, \"\"trip_event\"\": null, \"\"gpsdatatime\"\": \"\"2020-01-02T07:59:22+00:00\"\", \"\"harsh_force\"\": 0.25, \"\"speed_miles\"\": 0.0, \"\"trip_number\"\": null, \"\"acceleration\"\": 0.0, \"\"braking_alarm\"\": false, \"\"fuel_consumed\"\": 22573, \"\"harsh_braking\"\": false, \"\"odometer_miles\"\": 3024.83495292, \"\"cornering_alarm\"\": null, \"\"harsh_cornering\"\": false, \"\"speed_gps_miles\"\": 0.0, \"\"gps_braking_alarm\"\": false, \"\"throttle_position\"\": 14, \"\"acceleration_alarm\"\": false, \"\"harsh_acceleration\"\": true, \"\"coolant_temperature\"\": 38, \"\"gps_acceleration_alarm\"\": false, \"\"intake_air_temperature\"\": 10, \"\"harsh_cornering_degrees\"\": 0, \"\"manifold_absolute_pressure\"\": 36}, {\"\"rpm\"\": 350, \"\"geom\"\": \"\"0101000020E61000003BA92F4B3BB5E9BFCEC3094CA7E74940\"\", \"\"speed\"\": 0.0, \"\"airflow\"\": 0.0, \"\"g_force\"\": 0.0, \"\"accuracy\"\": \"\"FixOk\"\", \"\"ignition\"\": 1, \"\"latitude\"\": 51.809793, \"\"odometer\"\": 4868, \"\"longitude\"\": -0.803373, \"\"speed_gps\"\": 0, \"\"trip_event\"\": null, \"\"gpsdatatime\"\": \"\"2020-01-02T07:59:37+00:00\"\", \"\"harsh_force\"\": 0.25, \"\"speed_miles\"\": 0.0, \"\"trip_number\"\": null, \"\"acceleration\"\": 0.0, \"\"braking_alarm\"\": false, \"\"fuel_consumed\"\": 22577, \"\"harsh_braking\"\": false, \"\"odometer_miles\"\": 3024.83495292, \"\"cornering_alarm\"\": null, \"\"harsh_cornering\"\": false, \"\"speed_gps_miles\"\": 0.0, \"\"gps_braking_alarm\"\": false, \"\"throttle_position\"\": 14, \"\"acceleration_alarm\"\": false, \"\"harsh_acceleration\"\": true, \"\"coolant_temperature\"\": 38, \"\"gps_acceleration_alarm\"\": false, \"\"intake_air_temperature\"\": 10, \"\"harsh_cornering_degrees\"\": 0, \"\"manifold_absolute_pressure\"\": 36}, {\"\"rpm\"\": 350, \"\"geom\"\": \"\"0101000020E61000003BA92F4B3BB5E9BFCEC3094CA7E74940\"\", \"\"speed\"\": 0.0, \"\"airflow\"\": 0.0, \"\"g_force\"\": 0.0, \"\"accuracy\"\": \"\"FixOk\"\", \"\"ignition\"\": 1, \"\"latitude\"\": 51.809793, \"\"odometer\"\": 4868, \"\"longitude\"\": -0.803373, \"\"speed_gps\"\": 0, \"\"trip_event\"\": null, \"\"gpsdatatime\"\": \"\"2020-01-02T07:59:52+00:00\"\", \"\"harsh_force\"\": 0.25, \"\"speed_miles\"\": 0.0, \"\"trip_number\"\": null, \"\"acceleration\"\": 0.0, \"\"braking_alarm\"\": false, \"\"fuel_consumed\"\": 22582, \"\"harsh_braking\"\": false, \"\"odometer_miles\"\": 3024.83495292, \"\"cornering_alarm\"\": null, \"\"harsh_cornering\"\": false, \"\"speed_gps_miles\"\": 0.0, \"\"gps_braking_alarm\"\": false, \"\"throttle_position\"\": 14, \"\"acceleration_alarm\"\": false, \"\"harsh_acceleration\"\": true, \"\"coolant_temperature\"\": 38, \"\"gps_acceleration_alarm\"\": false, \"\"intake_air_temperature\"\": 10, \"\"harsh_cornering_degrees\"\": 0, \"\"manifold_absolute_pressure\"\": 36}, {\"\"rpm\"\": 350, \"\"geom\"\": \"\"0101000020E61000003BA92F4B3BB5E9BFCEC3094CA7E74940\"\", \"\"speed\"\": 0.0, \"\"airflow\"\": 0.0, \"\"g_force\"\": 0.0, \"\"accuracy\"\": \"\"FixOk\"\", \"\"ignition\"\": 1, \"\"latitude\"\": 51.809793, \"\"odometer\"\": 4868, \"\"longitude\"\": -0.803373, \"\"speed_gps\"\": 0, \"\"trip_event\"\": null, \"\"gpsdatatime\"\": \"\"2020-01-02T08:00:03+00:00\"\", \"\"harsh_force\"\": 0.25, \"\"speed_miles\"\": 0.0, \"\"trip_number\"\": null, \"\"acceleration\"\": 0.0, \"\"braking_alarm\"\": false, \"\"fuel_consumed\"\": 22584, \"\"harsh_braking\"\": false, \"\"odometer_miles\"\": 3024.83495292, \"\"cornering_alarm\"\": null, \"\"harsh_cornering\"\": false, \"\"speed_gps_miles\"\": 0.0, \"\"gps_braking_alarm\"\": false, \"\"throttle_position\"\": 14, \"\"acceleration_alarm\"\": false, \"\"harsh_acceleration\"\": true, \"\"coolant_temperature\"\": 38, \"\"gps_acceleration_alarm\"\": false, \"\"intake_air_temperature\"\": 10, \"\"harsh_cornering_degrees\"\": 0, \"\"manifold_absolute_pressure\"\": 36}, {\"\"rpm\"\": 350, \"\"geom\"\": \"\"0101000020E61000003BA92F4B3BB5E9BFCEC3094CA7E74940\"\", \"\"speed\"\": 0.0, \"\"airflow\"\": 0.0, \"\"g_force\"\": 0.0, \"\"accuracy\"\": \"\"FixOk\"\", \"\"ignition\"\": 1, \"\"latitude\"\": 51.809793, \"\"odometer\"\": 4868, \"\"longitude\"\": -0.803373, \"\"speed_gps\"\": 0, \"\"trip_event\"\": null, \"\"gpsdatatime\"\": \"\"2020-01-02T08:00:32+00:00\"\", \"\"harsh_force\"\": 0.25, \"\"speed_miles\"\": 0.0, \"\"trip_number\"\": null, \"\"acceleration\"\": 0.0, \"\"braking_alarm\"\": false, \"\"fuel_consumed\"\": 22584, \"\"harsh_braking\"\": false, \"\"odometer_miles\"\": 3024.83495292, \"\"cornering_alarm\"\": null, \"\"harsh_cornering\"\": false, \"\"speed_gps_miles\"\": 0.0, \"\"gps_braking_alarm\"\": false, \"\"throttle_position\"\": 14, \"\"acceleration_alarm\"\": false, \"\"harsh_acceleration\"\": true, \"\"coolant_temperature\"\": 38, \"\"gps_acceleration_alarm\"\": false, \"\"intake_air_temperature\"\": 10, \"\"harsh_cornering_degrees\"\": 0, \"\"manifold_absolute_pressure\"\": 36}, {\"\"rpm\"\": 350, \"\"geom\"\": \"\"0101000020E61000003BA92F4B3BB5E9BFCEC3094CA7E74940\"\", \"\"speed\"\": 0.0, \"\"airflow\"\": 0.0, \"\"g_force\"\": 0.0, \"\"accuracy\"\": \"\"FixOk\"\", \"\"ignition\"\": 1, \"\"latitude\"\": 51.809793, \"\"odometer\"\": 4868, \"\"longitude\"\": -0.803373, \"\"speed_gps\"\": 0, \"\"trip_event\"\": null, \"\"gpsdatatime\"\": \"\"2020-01-02T08:00:59+00:00\"\", \"\"harsh_force\"\": 0.25, \"\"speed_miles\"\": 0.0, \"\"trip_number\"\": null, \"\"acceleration\"\": 0.0, \"\"braking_alarm\"\": false, \"\"fuel_consumed\"\": 22584, \"\"harsh_braking\"\": false, \"\"odometer_miles\"\": 3024.83495292, \"\"cornering_alarm\"\": null, \"\"harsh_cornering\"\": false, \"\"speed_gps_miles\"\": 0.0, \"\"gps_braking_alarm\"\": false, \"\"throttle_position\"\": 14, \"\"acceleration_alarm\"\": false, \"\"harsh_acceleration\"\": true, \"\"coolant_temperature\"\": 38, \"\"gps_acceleration_alarm\"\": false, \"\"intake_air_temperature\"\": 10, \"\"harsh_cornering_degrees\"\": 0, \"\"manifold_absolute_pressure\"\": 36}]\""
-- "
testString1 = "{\"rpm\": 893, \"geom\": \"0101000020E6100000B554DE8E70DAE9BF6F9EEA909BE74940\", \"speed\": 46.670976, \"airflow\": 8.13, \"g_force\": 0, \"accuracy\": \"FixOk\", \"ignition\": 1, \"latitude\": 51.809435, \"odometer\": 4867, \"longitude\": -0.807915, \"speed_gps\": 0, \"trip_event\": null, \"gpsdatatime\": \"2020-01-02T07:57:31+00:00\", \"harsh_force\": 0.25, \"speed_miles\": 28.99999989558144, \"trip_number\": null, \"acceleration\": 0, \"braking_alarm\": false, \"fuel_consumed\": 22563, \"harsh_braking\": false, \"odometer_miles\": 3024.21358173, \"cornering_alarm\": null, \"harsh_cornering\": false, \"speed_gps_miles\": 0.0, \"throttle_position\": 14, \"acceleration_alarm\": false, \"harsh_acceleration\": true, \"coolant_temperature\": 29, \"intake_air_temperature\": 8, \"harsh_cornering_degrees\": 0, \"manifold_absolute_pressure\": 97} "

data EmtecRecord = EmtecRecord
   {
    rpm ::  Maybe Int ,
    geom ::  Text,
    speed ::  Maybe Double
   } deriving (Generic, Show)


data EmtecCSV  =
  EmtecCSV
    {
    date :: Text , jsonData :: Maybe EmtecRecord
    } deriving (Generic,Show)


instance DA.FromJSON EmtecRecord

regex =  mkRegex "\"\""

colapseQuotes s =  subRegex regex  s "\""

decoder :: BS.ByteString -> Maybe EmtecRecord
decoder = DA.decode . BLU.fromString . colapseQuotes . BU.toString

instance DC.FromField (Maybe EmtecRecord) where
  parseField   =  pure . decoder


instance DC.FromRecord EmtecCSV
  where
    parseRecord m  =  EmtecCSV <$> (m DC..! 0)  <*>  (m DC..! 1)  --( ::  (DC.Parser (Maybe EmtecRecord)  ) )


csvParser :: BLU.ByteString  -> Either String (V.Vector  EmtecCSV)
csvParser s = DC.decode  DC.NoHeader s

dec =  colapseQuotes
main :: IO ()
main =  print  (csvParser   testEmtecString     )

我设法解析 json 或 csv,但是将这些东西粘合在一起超出了我目前对 Haskell 的理解(我是一个非常新手)我认为问题是我没有属性实例化 DC.FromRecord 并且我得到了的错误

• Overlapping instances for DC.FromField (Maybe EmtecRecord)
    arising from a use of ‘DC..!’
  Matching instances:
    instance DC.FromField a => DC.FromField (Maybe a)
      -- Defined in ‘cassava-0.5.2.0:Data.Csv.Conversion’
    instance DC.FromField (Maybe EmtecRecord)
      -- Defined at app/Main.hs:60:10
• In the second argument of ‘(<*>)’, namely ‘(m DC..! 1)’
  In the expression: EmtecCSV <$> (m DC..! 0) <*> (m DC..! 1)
  In an equation for ‘DC.parseRecord’:
      DC.parseRecord m = EmtecCSV <$> (m DC..! 0) <*> (m DC..! 1)

| 66 | parseRecord m = EmtecCSV <$> (m DC..!0) <*> (m DC..!1) --( :: (DC.Parser (Maybe EmtecRecord) ) )

Any insites of how can i overcome that obstacle ?

标签: jsoncsvhaskell

解决方案


更改parseField = pure . decoderparseField = maybe empty pure . decoder,然后将所有出现的 替换Maybe EmtecRecordEmtecRecord


推荐阅读