CSV

Constant CSV 

Source
pub const CSV: &str = "// CSV \u{6570}\u{636e}\u{5904}\u{7406}\u{5de5}\u{5177}\u{5e93}\n// CSV Data Processing Utilities\n// \u{63d0}\u{4f9b} CSV \u{683c}\u{5f0f}\u{6570}\u{636e}\u{7684}\u{89e3}\u{6790}\u{3001}\u{751f}\u{6210}\u{548c}\u{64cd}\u{4f5c}\u{529f}\u{80fd}\n\n// ============================================================\n// CSV \u{89e3}\u{6790}\n// ============================================================\n\n// CSV_PARSE - \u{89e3}\u{6790} CSV \u{6587}\u{672c}\u{4e3a}\u{4e8c}\u{7ef4}\u{6570}\u{7ec4}\n// \u{53c2}\u{6570}:\n//   TEXT - CSV \u{6587}\u{672c}\u{5b57}\u{7b26}\u{4e32}\n//   DELIMITER - \u{5206}\u{9694}\u{7b26}\u{ff08}\u{9ed8}\u{8ba4}\u{4e3a}\u{9017}\u{53f7}\",\"\u{ff09}\n// \u{8fd4}\u{56de}: \u{4e8c}\u{7ef4}\u{6570}\u{7ec4}\u{ff0c}\u{6bcf}\u{884c}\u{4e3a}\u{4e00}\u{4e2a}\u{6570}\u{7ec4}\n// \u{793a}\u{4f8b}:\n//   Set CSV_TEXT \"name,age,city\\nAlice,30,Beijing\\nBob,25,Shanghai\"\n//   Set DATA CSV_PARSE(CSV_TEXT, \",\")\n//   // [[\"name\",\"age\",\"city\"], [\"Alice\",\"30\",\"Beijing\"], [\"Bob\",\"25\",\"Shanghai\"]]\nFunc CSV_PARSE(CSV_TEXT) {\n    If (TYPE(CSV_TEXT) != \"String\") {\n        Return []\n    }\n    \n    Set LINES SPLIT(CSV_TEXT, \"\\n\")\n    Set RESULT []\n    Set I 0\n    Set LEN_LINES LEN(LINES)\n    \n    While (I < LEN_LINES) {\n        Set LINE TRIM(LINES[I])\n        If (LEN(LINE) > 0) {\n            Set ROW SPLIT(LINE, \",\")\n            Set RESULT PUSH(RESULT, ROW)\n        }\n        Set I (I + 1)\n    }\n    \n    Return RESULT\n}\n\n// CSV_PARSE_DEFAULT - \u{4f7f}\u{7528}\u{9ed8}\u{8ba4}\u{5206}\u{9694}\u{7b26}\u{ff08}\u{9017}\u{53f7}\u{ff09}\u{89e3}\u{6790} CSV\nFunc CSV_PARSE_DEFAULT(TEXT) {\n    Return CSV_PARSE(TEXT, \",\")\n}\n\n// ============================================================\n// CSV \u{8f6c}\u{6362}\u{4e3a}\u{5b57}\u{5178}\u{6570}\u{7ec4}\n// ============================================================\n\n// CSV_TO_DICT_ARRAY - \u{5c06} CSV \u{6570}\u{636e}\u{8f6c}\u{6362}\u{4e3a}\u{5b57}\u{5178}\u{6570}\u{7ec4}\n// \u{53c2}\u{6570}:\n//   TEXT - CSV \u{6587}\u{672c}\u{ff08}\u{7b2c}\u{4e00}\u{884c}\u{4e3a}\u{6807}\u{9898}\u{ff09}\n//   DELIMITER - \u{5206}\u{9694}\u{7b26}\u{ff08}\u{53ef}\u{9009}\u{ff0c}\u{9ed8}\u{8ba4}\u{4e3a}\",\"\u{ff09}\n// \u{8fd4}\u{56de}: \u{5b57}\u{5178}\u{6570}\u{7ec4}\u{ff0c}\u{6bcf}\u{884c}\u{6570}\u{636e}\u{4e3a}\u{4e00}\u{4e2a}\u{5b57}\u{5178}\n// \u{793a}\u{4f8b}:\n//   Set CSV_TEXT \"name,age,city\\nAlice,30,Beijing\\nBob,25,Shanghai\"\n//   Set USERS CSV_TO_DICT_ARRAY(CSV_TEXT, \",\")\n//   // [{\"name\":\"Alice\",\"age\":\"30\",\"city\":\"Beijing\"}, {\"name\":\"Bob\",\"age\":\"25\",\"city\":\"Shanghai\"}]\nFunc CSV_TRANSPOSE(CSV_DATA) {\n    If (TYPE(CSV_DATA) != \"Array\" || LEN(CSV_DATA) == 0) {\n        Return []\n    }\n    \n    Set FIRST_ROW CSV_DATA[0]\n    Set NUM_COLS LEN(FIRST_ROW)\n    Set NUM_ROWS LEN(CSV_DATA)\n    \n    Set RESULT []\n    Set COL 0\n    \n    While (COL < NUM_COLS) {\n        Set NEW_ROW []\n        Set ROW 0\n        \n        While (ROW < NUM_ROWS) {\n            Set CURRENT_ROW CSV_DATA[ROW]\n            If (COL < LEN(CURRENT_ROW)) {\n                Set VALUE CURRENT_ROW[COL]\n                Set NEW_ROW PUSH(NEW_ROW, VALUE)\n            } Else {\n                Set NEW_ROW PUSH(NEW_ROW, \"\")\n            }\n            Set ROW (ROW + 1)\n        }\n        \n        Set RESULT PUSH(RESULT, NEW_ROW)\n        Set COL (COL + 1)\n    }\n    \n    Return RESULT\n}\n\n// CSV_TO_DICT_ARRAY_DEFAULT - \u{4f7f}\u{7528}\u{9ed8}\u{8ba4}\u{5206}\u{9694}\u{7b26}\u{8f6c}\u{6362}\nFunc CSV_TO_DICT_ARRAY_DEFAULT(TEXT) {\n    Return CSV_TO_DICT_ARRAY(TEXT, \",\")\n}\n\n// ============================================================\n// \u{5b57}\u{5178}\u{6570}\u{7ec4}\u{8f6c} CSV\n// ============================================================\n\n// CSV_FROM_DICT_ARRAY - \u{5c06}\u{5b57}\u{5178}\u{6570}\u{7ec4}\u{8f6c}\u{6362}\u{4e3a} CSV \u{6587}\u{672c}\n// \u{53c2}\u{6570}:\n//   DATA - \u{5b57}\u{5178}\u{6570}\u{7ec4}\n//   HEADERS - \u{5217}\u{6807}\u{9898}\u{6570}\u{7ec4}\u{ff08}\u{53ef}\u{9009}\u{ff09}\n//   DELIMITER - \u{5206}\u{9694}\u{7b26}\u{ff08}\u{9ed8}\u{8ba4}\u{4e3a}\",\"\u{ff09}\n// \u{8fd4}\u{56de}: CSV \u{6587}\u{672c}\u{5b57}\u{7b26}\u{4e32}\nFunc CSV_FROM_DICT_ARRAY(DATA, HEADERS, DELIMITER) {\n    If (TYPE(DATA) != \"Array\" || LEN(DATA) == 0) {\n        Return \"\"\n    }\n    \n    Set ACTUAL_HEADERS HEADERS\n    \n    // \u{5982}\u{679c}\u{6ca1}\u{6709}\u{63d0}\u{4f9b}\u{6807}\u{9898}\u{ff0c}\u{4ece}\u{7b2c}\u{4e00}\u{884c}\u{6570}\u{636e}\u{63d0}\u{53d6}\n    If (TYPE(ACTUAL_HEADERS) != \"Array\" || LEN(ACTUAL_HEADERS) == 0) {\n        Set FIRST_ROW DATA[0]\n        If (TYPE(FIRST_ROW) == \"Dict\") {\n            Set ACTUAL_HEADERS KEYS(FIRST_ROW)\n        } Else {\n            Return \"\"\n        }\n    }\n    \n    // \u{6784}\u{5efa}\u{6807}\u{9898}\u{884c}\n    Set RESULT JOIN(ACTUAL_HEADERS, DELIMITER)\n    Set RESULT (RESULT + \"\\n\")\n    \n    // \u{6784}\u{5efa}\u{6570}\u{636e}\u{884c}\n    Set I 0\n    Set ROW_COUNT LEN(DATA)\n    \n    While (I < ROW_COUNT) {\n        Set ROW_DATA DATA[I]\n        \n        If (TYPE(ROW_DATA) == \"Dict\") {\n            Set ROW_VALUES []\n            Set J 0\n            Set COL_COUNT LEN(ACTUAL_HEADERS)\n            \n            While (J < COL_COUNT) {\n                Set HEADER ACTUAL_HEADERS[J]\n                Set VALUE \"\"\n                \n                If (HAS(ROW_DATA, HEADER)) {\n                    Set VALUE ROW_DATA[HEADER]\n                    Set VALUE TO_STRING(VALUE)\n                }\n                \n                Set ROW_VALUES PUSH(ROW_VALUES, VALUE)\n                Set J (J + 1)\n            }\n            \n            Set ROW_LINE JOIN(ROW_VALUES, DELIMITER)\n            Set RESULT (RESULT + ROW_LINE)\n            \n            If (I < (ROW_COUNT - 1)) {\n                Set RESULT (RESULT + \"\\n\")\n            }\n        }\n        \n        Set I (I + 1)\n    }\n    \n    Return RESULT\n}\n\n// CSV_FROM_DICT_ARRAY_DEFAULT - \u{4f7f}\u{7528}\u{9ed8}\u{8ba4}\u{5206}\u{9694}\u{7b26}\u{751f}\u{6210} CSV\nFunc CSV_FROM_DICT_ARRAY_DEFAULT(DATA, HEADERS) {\n    Return CSV_FROM_DICT_ARRAY(DATA, HEADERS, \",\")\n}\n\n// ============================================================\n// CSV \u{6570}\u{636e}\u{64cd}\u{4f5c}\n// ============================================================\n\n// CSV_COLUMN - \u{4ece} CSV \u{6570}\u{636e}\u{4e2d}\u{63d0}\u{53d6}\u{6307}\u{5b9a}\u{5217}\n// \u{53c2}\u{6570}:\n//   DATA - \u{5b57}\u{5178}\u{6570}\u{7ec4}\u{6216}\u{4e8c}\u{7ef4}\u{6570}\u{7ec4}\n//   COL - \u{5217}\u{540d}\u{ff08}\u{5b57}\u{7b26}\u{4e32}\u{ff09}\u{6216}\u{5217}\u{7d22}\u{5f15}\u{ff08}\u{6570}\u{5b57}\u{ff09}\n// \u{8fd4}\u{56de}: \u{6307}\u{5b9a}\u{5217}\u{7684}\u{503c}\u{6570}\u{7ec4}\nFunc CSV_COLUMN(DATA, COL) {\n    If (TYPE(DATA) != \"Array\" || LEN(DATA) == 0) {\n        Return []\n    }\n    \n    Set RESULT []\n    Set FIRST_ITEM DATA[0]\n    \n    // \u{5224}\u{65ad}\u{662f}\u{5b57}\u{5178}\u{6570}\u{7ec4}\u{8fd8}\u{662f}\u{4e8c}\u{7ef4}\u{6570}\u{7ec4}\n    If (TYPE(FIRST_ITEM) == \"Dict\") {\n        // \u{5b57}\u{5178}\u{6570}\u{7ec4}\u{ff0c}\u{6309}\u{5217}\u{540d}\u{63d0}\u{53d6}\n        If (TYPE(COL) != \"String\") {\n            Return []\n        }\n        \n        Set I 0\n        Set LEN_DATA LEN(DATA)\n        \n        While (I < LEN_DATA) {\n            Set ROW DATA[I]\n            \n            If (HAS(ROW, COL)) {\n                Set VALUE ROW[COL]\n                Set RESULT PUSH(RESULT, VALUE)\n            } Else {\n                Set RESULT PUSH(RESULT, Null)\n            }\n            \n            Set I (I + 1)\n        }\n    } Else {\n        // \u{4e8c}\u{7ef4}\u{6570}\u{7ec4}\u{ff0c}\u{6309}\u{7d22}\u{5f15}\u{63d0}\u{53d6}\n        If (TYPE(COL) != \"Number\") {\n            Return []\n        }\n        \n        Set I 0\n        Set LEN_DATA LEN(DATA)\n        \n        While (I < LEN_DATA) {\n            Set ROW DATA[I]\n            \n            If (TYPE(ROW) == \"Array\" && COL < LEN(ROW)) {\n                Set VALUE ROW[COL]\n                Set RESULT PUSH(RESULT, VALUE)\n            } Else {\n                Set RESULT PUSH(RESULT, Null)\n            }\n            \n            Set I (I + 1)\n        }\n    }\n    \n    Return RESULT\n}\n\n// CSV_FILTER_ROWS - \u{8fc7}\u{6ee4} CSV \u{884c}\n// \u{53c2}\u{6570}:\n//   DATA - \u{5b57}\u{5178}\u{6570}\u{7ec4}\n//   COL - \u{5217}\u{540d}\n//   VALUE - \u{5339}\u{914d}\u{503c}\n// \u{8fd4}\u{56de}: \u{8fc7}\u{6ee4}\u{540e}\u{7684}\u{6570}\u{7ec4}\nFunc CSV_FILTER_ROWS(CSV_DATA, COL_INDEX, VALUE) {\n    If (TYPE(CSV_DATA) != \"Array\") {\n        Return []\n    }\n    \n    Set RESULT []\n    Set I 0\n    Set LEN_DATA LEN(CSV_DATA)\n    \n    While (I < LEN_DATA) {\n        Set ROW CSV_DATA[I]\n        If (TYPE(ROW) == \"Array\" && COL_INDEX < LEN(ROW)) {\n            Set CELL_VALUE ROW[COL_INDEX]\n            If (CELL_VALUE == VALUE) {\n                Set RESULT PUSH(RESULT, ROW)\n            }\n        }\n        Set I (I + 1)\n    }\n    \n    Return RESULT\n}\n\n// CSV_SELECT_COLUMNS - \u{9009}\u{62e9}\u{6307}\u{5b9a}\u{7684}\u{5217}\n// \u{53c2}\u{6570}:\n//   DATA - \u{5b57}\u{5178}\u{6570}\u{7ec4}\n//   COLUMNS - \u{5217}\u{540d}\u{6570}\u{7ec4}\n// \u{8fd4}\u{56de}: \u{53ea}\u{5305}\u{542b}\u{6307}\u{5b9a}\u{5217}\u{7684}\u{65b0}\u{6570}\u{7ec4}\nFunc CSV_SELECT_COLUMNS(DATA, COLUMNS) {\n    If (TYPE(DATA) != \"Array\" || TYPE(COLUMNS) != \"Array\") {\n        Return []\n    }\n    \n    Set RESULT []\n    Set I 0\n    Set LEN_DATA LEN(DATA)\n    \n    While (I < LEN_DATA) {\n        Set ROW DATA[I]\n        \n        If (TYPE(ROW) == \"Dict\") {\n            Set NEW_ROW {}\n            Set J 0\n            Set COL_COUNT LEN(COLUMNS)\n            \n            While (J < COL_COUNT) {\n                Set COL_NAME COLUMNS[J]\n                \n                If (HAS(ROW, COL_NAME)) {\n                    Set VALUE ROW[COL_NAME]\n                    Set NEW_ROW[COL_NAME] VALUE\n                }\n                \n                Set J (J + 1)\n            }\n            \n            Set RESULT PUSH(RESULT, NEW_ROW)\n        }\n        \n        Set I (I + 1)\n    }\n    \n    Return RESULT\n}\n\n// ============================================================\n// CSV \u{7edf}\u{8ba1}\u{5206}\u{6790}\n// ============================================================\n\n// CSV_ROW_COUNT - \u{83b7}\u{53d6}\u{6570}\u{636e}\u{884c}\u{6570}\n// \u{53c2}\u{6570}:\n//   DATA - CSV \u{6570}\u{636e}\u{ff08}\u{6570}\u{7ec4}\u{ff09}\n// \u{8fd4}\u{56de}: \u{884c}\u{6570}\nFunc CSV_ROW_COUNT(DATA) {\n    If (TYPE(DATA) != \"Array\") {\n        Return 0\n    }\n    Return LEN(DATA)\n}\n\n// CSV_COLUMN_COUNT - \u{83b7}\u{53d6}\u{5217}\u{6570}\n// \u{53c2}\u{6570}:\n//   DATA - CSV \u{6570}\u{636e}\n// \u{8fd4}\u{56de}: \u{5217}\u{6570}\nFunc CSV_COLUMN_COUNT(DATA) {\n    If (TYPE(DATA) != \"Array\" || LEN(DATA) == 0) {\n        Return 0\n    }\n    \n    Set FIRST_ROW DATA[0]\n    \n    If (TYPE(FIRST_ROW) == \"Dict\") {\n        Return LEN(KEYS(FIRST_ROW))\n    } Elif (TYPE(FIRST_ROW) == \"Array\") {\n        Return LEN(FIRST_ROW)\n    } Else {\n        Return 0\n    }\n}\n\n// CSV_COLUMN_NAMES - \u{83b7}\u{53d6}\u{5217}\u{540d}\u{5217}\u{8868}\n// \u{53c2}\u{6570}:\n//   DATA - \u{5b57}\u{5178}\u{6570}\u{7ec4}\n// \u{8fd4}\u{56de}: \u{5217}\u{540d}\u{6570}\u{7ec4}\nFunc CSV_COLUMN_NAMES(DATA) {\n    If (TYPE(DATA) != \"Array\" || LEN(DATA) == 0) {\n        Return []\n    }\n    \n    Set FIRST_ROW DATA[0]\n    \n    If (TYPE(FIRST_ROW) == \"Dict\") {\n        Return KEYS(FIRST_ROW)\n    } Else {\n        Return []\n    }\n}\n\n// CSV_UNIQUE_VALUES - \u{83b7}\u{53d6}\u{67d0}\u{5217}\u{7684}\u{552f}\u{4e00}\u{503c}\n// \u{53c2}\u{6570}:\n//   DATA - \u{5b57}\u{5178}\u{6570}\u{7ec4}\n//   COL - \u{5217}\u{540d}\n// \u{8fd4}\u{56de}: \u{552f}\u{4e00}\u{503c}\u{6570}\u{7ec4}\nFunc CSV_UNIQUE_VALUES(DATA, COL) {\n    Set COLUMN_DATA CSV_COLUMN(DATA, COL)\n    Set RESULT []\n    Set I 0\n    Set LEN_DATA LEN(COLUMN_DATA)\n    \n    While (I < LEN_DATA) {\n        Set VALUE COLUMN_DATA[I]\n        Set FOUND False\n        Set J 0\n        \n        While (J < LEN(RESULT)) {\n            If (RESULT[J] == VALUE) {\n                Set FOUND True\n                Set J LEN(RESULT)\n            }\n            Set J (J + 1)\n        }\n        \n        If (!FOUND && TYPE(VALUE) != \"Null\") {\n            Set RESULT PUSH(RESULT, VALUE)\n        }\n        \n        Set I (I + 1)\n    }\n    \n    Return RESULT\n}\n\n// CSV_COUNT_BY - \u{6309}\u{5217}\u{7edf}\u{8ba1}\u{6570}\u{91cf}\n// \u{53c2}\u{6570}:\n//   DATA - \u{5b57}\u{5178}\u{6570}\u{7ec4}\n//   COL - \u{5217}\u{540d}\n// \u{8fd4}\u{56de}: \u{5b57}\u{5178}\u{ff0c}\u{952e}\u{4e3a}\u{503c}\u{ff0c}\u{503c}\u{4e3a}\u{51fa}\u{73b0}\u{6b21}\u{6570}\nFunc CSV_COUNT_BY(DATA, COL) {\n    If (TYPE(DATA) != \"Array\") {\n        Return {}\n    }\n    \n    Set RESULT {}\n    Set I 0\n    Set LEN_DATA LEN(DATA)\n    \n    While (I < LEN_DATA) {\n        Set ROW DATA[I]\n        \n        If (TYPE(ROW) == \"Dict\" && HAS(ROW, COL)) {\n            Set VALUE ROW[COL]\n            Set VALUE_STR TO_STRING(VALUE)\n            \n            If (HAS(RESULT, VALUE_STR)) {\n                Set COUNT RESULT[VALUE_STR]\n                Set RESULT[VALUE_STR] (COUNT + 1)\n            } Else {\n                Set RESULT[VALUE_STR] 1\n            }\n        }\n        \n        Set I (I + 1)\n    }\n    \n    Return RESULT\n}\n\n// ============================================================\n// CSV \u{5b9e}\u{7528}\u{5de5}\u{5177}\n// ============================================================\n\n// CSV_JOIN - \u{8fde}\u{63a5}\u{4e24}\u{4e2a} CSV \u{6570}\u{636e}\u{96c6}\n// \u{53c2}\u{6570}:\n//   DATA1 - \u{7b2c}\u{4e00}\u{4e2a}\u{6570}\u{636e}\u{96c6}\u{ff08}\u{5b57}\u{5178}\u{6570}\u{7ec4}\u{ff09}\n//   DATA2 - \u{7b2c}\u{4e8c}\u{4e2a}\u{6570}\u{636e}\u{96c6}\u{ff08}\u{5b57}\u{5178}\u{6570}\u{7ec4}\u{ff09}\n//   KEY - \u{8fde}\u{63a5}\u{952e}\u{ff08}\u{5217}\u{540d}\u{ff09}\n// \u{8fd4}\u{56de}: \u{8fde}\u{63a5}\u{540e}\u{7684}\u{6570}\u{636e}\u{96c6}\nFunc CSV_JOIN(CSV_DATA1, CSV_DATA2, COL_INDEX1, COL_INDEX2) {\n    If (TYPE(CSV_DATA1) != \"Array\" || TYPE(CSV_DATA2) != \"Array\") {\n        Return []\n    }\n    \n    Set RESULT []\n    Set I 0\n    Set LEN1 LEN(CSV_DATA1)\n    \n    While (I < LEN1) {\n        Set ROW1 CSV_DATA1[I]\n        If (TYPE(ROW1) == \"Array\" && COL_INDEX1 < LEN(ROW1)) {\n            Set KEY1 ROW1[COL_INDEX1]\n            \n            Set J 0\n            Set LEN2 LEN(CSV_DATA2)\n            While (J < LEN2) {\n                Set ROW2 CSV_DATA2[J]\n                If (TYPE(ROW2) == \"Array\" && COL_INDEX2 < LEN(ROW2)) {\n                    Set KEY2 ROW2[COL_INDEX2]\n                    \n                    If (KEY1 == KEY2) {\n                        Set JOINED_ROW []\n                        Set K 0\n                        While (K < LEN(ROW1)) {\n                            Set JOINED_ROW PUSH(JOINED_ROW, ROW1[K])\n                            Set K (K + 1)\n                        }\n                        Set K 0\n                        While (K < LEN(ROW2)) {\n                            Set JOINED_ROW PUSH(JOINED_ROW, ROW2[K])\n                            Set K (K + 1)\n                        }\n                        Set RESULT PUSH(RESULT, JOINED_ROW)\n                    }\n                }\n                Set J (J + 1)\n            }\n        }\n        Set I (I + 1)\n    }\n    \n    Return RESULT\n}\n\n// CSV_SORT_BY - \u{6309}\u{5217}\u{6392}\u{5e8f}\u{ff08}\u{7b80}\u{5355}\u{7248}\u{672c}\u{ff09}\n// \u{6ce8}\u{610f}\u{ff1a}\u{9700}\u{8981}\u{5b9e}\u{73b0}\u{6392}\u{5e8f}\u{7b97}\u{6cd5}\u{ff0c}\u{8fd9}\u{91cc}\u{8fd4}\u{56de}\u{539f}\u{6570}\u{636e}\nFunc CSV_SORT_BY(DATA, COL) {\n    // TODO: \u{5b9e}\u{73b0}\u{6392}\u{5e8f}\u{7b97}\u{6cd5}\n    Return DATA\n}\n\n";
Expand description

CSV 数据处理