json - 带有 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 ?
解决方案
更改parseField = pure . decoder
为parseField = maybe empty pure . decoder
,然后将所有出现的 替换Maybe EmtecRecord
为EmtecRecord
。
推荐阅读
- react-native - 导出为 pdf 未处理的承诺
- css - 如何使用带有 sass-autocompile 插件的 atom 将 .scss 文件直接编译到我的服务器上
- c++ - 如何定义采用最通用数量和类型的参数的函数
- security - TightVNC:如何列出所有连接的用户
- java - 无法通过 Docker 连接到外部 Mongodb IP
- c# - Transform.Find 从子到父
- javascript - React Scroll Spy 库 (organism-react-scroll-nav) npm 包
- javascript - 在 package.json V/s index.js 中指定的 Ember 命名差异
- javascript - JSON对象克隆
- node.js - ReactJS:从 S3 渲染私有图像资产