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{53ef}\u{9009}\u{ff0c}\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, DELIMITER) {\n    If (TYPE(CSV_TEXT) != \"String\") {\n        Return []\n    }\n    \n    // \u{9ed8}\u{8ba4}\u{5206}\u{9694}\u{7b26}\n    Set SEP \",\"\n    If (TYPE(DELIMITER) == \"String\" && LEN(DELIMITER) > 0) {\n        Set SEP DELIMITER\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, SEP)\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_TO_DICT_ARRAY(TEXT, DELIMITER) {\n    If (TYPE(TEXT) != \"String\") {\n        Return []\n    }\n    \n    // \u{9ed8}\u{8ba4}\u{5206}\u{9694}\u{7b26}\n    Set SEP \",\"\n    If (TYPE(DELIMITER) == \"String\" && LEN(DELIMITER) > 0) {\n        Set SEP DELIMITER\n    }\n    \n    // \u{5148}\u{89e3}\u{6790}\u{4e3a}\u{6570}\u{7ec4}\n    Set ROWS CSV_PARSE(TEXT, SEP)\n    If (LEN(ROWS) < 2) {\n        Return []\n    }\n    \n    // \u{7b2c}\u{4e00}\u{884c}\u{4f5c}\u{4e3a}\u{6807}\u{9898}\n    Set HEADERS ROWS[0]\n    Set RESULT []\n    Set I 1\n    Set LEN_ROWS LEN(ROWS)\n    \n    While (I < LEN_ROWS) {\n        Set ROW ROWS[I]\n        Set DICT {}\n        Set J 0\n        Set LEN_HEADERS LEN(HEADERS)\n        \n        While (J < LEN_HEADERS && J < LEN(ROW)) {\n            Set KEY HEADERS[J]\n            Set VALUE ROW[J]\n            Set DICT[KEY] VALUE\n            Set J (J + 1)\n        }\n        \n        Set RESULT PUSH(RESULT, DICT)\n        Set I (I + 1)\n    }\n    \n    Return RESULT\n}\n\n// CSV_TRANSPOSE - \u{8f6c}\u{7f6e} CSV \u{6570}\u{636e}\u{ff08}\u{884c}\u{53d8}\u{5217}\u{ff0c}\u{5217}\u{53d8}\u{884c}\u{ff09}\n// \u{53c2}\u{6570}:\n//   CSV_DATA - \u{4e8c}\u{7ef4}\u{6570}\u{7ec4}\u{ff08}CSV \u{6570}\u{636e}\u{ff09}\n// \u{8fd4}\u{56de}: \u{8f6c}\u{7f6e}\u{540e}\u{7684}\u{4e8c}\u{7ef4}\u{6570}\u{7ec4}\n// \u{793a}\u{4f8b}:\n//   Set DATA [[\"a\",\"b\",\"c\"], [\"1\",\"2\",\"3\"]]\n//   Set TRANSPOSED CSV_TRANSPOSE(DATA)\n//   // [[\"a\",\"1\"], [\"b\",\"2\"], [\"c\",\"3\"]]\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(DATA, COL, VALUE) {\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        If (TYPE(ROW) == \"Dict\" && HAS(ROW, COL)) {\n            Set CELL_VALUE ROW[COL]\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}\u{5b57}\u{5178}\u{6570}\u{7ec4}\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}\u{ff08}\u{5b57}\u{5178}\u{6570}\u{7ec4}\u{ff09}\nFunc CSV_JOIN(DATA1, DATA2, KEY) {\n    If (TYPE(DATA1) != \"Array\" || TYPE(DATA2) != \"Array\") {\n        Return []\n    }\n    \n    Set RESULT []\n    Set I 0\n    Set LEN1 LEN(DATA1)\n    \n    While (I < LEN1) {\n        Set ROW1 DATA1[I]\n        If (TYPE(ROW1) == \"Dict\" && HAS(ROW1, KEY)) {\n            Set KEY_VALUE ROW1[KEY]\n            \n            Set J 0\n            Set LEN2 LEN(DATA2)\n            While (J < LEN2) {\n                Set ROW2 DATA2[J]\n                If (TYPE(ROW2) == \"Dict\" && HAS(ROW2, KEY)) {\n                    Set ROW2_KEY_VALUE ROW2[KEY]\n                    \n                    If (KEY_VALUE == ROW2_KEY_VALUE) {\n                        // \u{521b}\u{5efa}\u{8fde}\u{63a5}\u{540e}\u{7684}\u{5b57}\u{5178}\u{ff0c}\u{5408}\u{5e76}\u{4e24}\u{4e2a}\u{5b57}\u{5178}\n                        Set JOINED_ROW {}\n                        \n                        // \u{590d}\u{5236}\u{7b2c}\u{4e00}\u{4e2a}\u{5b57}\u{5178}\u{7684}\u{6240}\u{6709}\u{5b57}\u{6bb5}\n                        Set KEYS1 KEYS(ROW1)\n                        Set K 0\n                        Set LEN_KEYS1 LEN(KEYS1)\n                        While (K < LEN_KEYS1) {\n                            Set FIELD KEYS1[K]\n                            Set JOINED_ROW[FIELD] ROW1[FIELD]\n                            Set K (K + 1)\n                        }\n                        \n                        // \u{590d}\u{5236}\u{7b2c}\u{4e8c}\u{4e2a}\u{5b57}\u{5178}\u{7684}\u{6240}\u{6709}\u{5b57}\u{6bb5}\u{ff08}\u{9664}\u{4e86}\u{8fde}\u{63a5}\u{952e}\u{ff09}\n                        Set KEYS2 KEYS(ROW2)\n                        Set K 0\n                        Set LEN_KEYS2 LEN(KEYS2)\n                        While (K < LEN_KEYS2) {\n                            Set FIELD KEYS2[K]\n                            If (FIELD != KEY) {\n                                Set JOINED_ROW[FIELD] ROW2[FIELD]\n                            }\n                            Set K (K + 1)\n                        }\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}\n// \u{53c2}\u{6570}:\n//   DATA - \u{5b57}\u{5178}\u{6570}\u{7ec4}\n//   COL - \u{5217}\u{540d}\n//   ORDER - \u{6bd4}\u{8f83}\u{51fd}\u{6570}\u{ff08}\u{53ef}\u{9009}\u{ff0c}\u{9ed8}\u{8ba4}\u{4e3a}\u{5347}\u{5e8f}\u{ff09}\n//         \u{6bd4}\u{8f83}\u{51fd}\u{6570}\u{63a5}\u{53d7}\u{4e24}\u{4e2a}\u{53c2}\u{6570} (a, b)\u{ff0c}\u{8fd4}\u{56de}:\n//         \u{8d1f}\u{6570}: a < b\n//         0: a == b  \n//         \u{6b63}\u{6570}: a > b\n// \u{8fd4}\u{56de}: \u{6309}\u{6307}\u{5b9a}\u{5217}\u{6392}\u{5e8f}\u{540e}\u{7684}\u{65b0}\u{6570}\u{7ec4}\nFunc CSV_SORT_BY(DATA, COL, ORDER) {\n    If (TYPE(DATA) != \"Array\" || LEN(DATA) == 0) {\n        Return []\n    }\n    \n    // \u{63d0}\u{53d6}\u{6392}\u{5e8f}\u{952e}\u{548c}\u{7d22}\u{5f15}\n    Set SORT_ITEMS []\n    Set I 0\n    Set LEN_DATA LEN(DATA)\n    \n    While (I < LEN_DATA) {\n        Set ROW DATA[I]\n        Set SORT_KEY Null\n        \n        If (TYPE(ROW) == \"Dict\" && HAS(ROW, COL)) {\n            Set SORT_KEY ROW[COL]\n        }\n        \n        // \u{521b}\u{5efa}\u{6392}\u{5e8f}\u{9879}\u{ff1a}{index: I, key: SORT_KEY}\n        Set ITEM {}\n        Set ITEM[\"index\"] I\n        Set ITEM[\"key\"] SORT_KEY\n        Set SORT_ITEMS PUSH(SORT_ITEMS, ITEM)\n        \n        Set I (I + 1)\n    }\n    \n    // \u{5192}\u{6ce1}\u{6392}\u{5e8f}\n    Set J 0\n    While (J < LEN(SORT_ITEMS)) {\n        Set K 0\n        While (K < (LEN(SORT_ITEMS) - 1 - J)) {\n            Set CURRENT SORT_ITEMS[K]\n            Set NEXT SORT_ITEMS[K + 1]\n            \n            // \u{6bd4}\u{8f83}\u{903b}\u{8f91}\u{ff1a}Null \u{503c}\u{6392}\u{5728}\u{6700}\u{540e}\n            Set SHOULD_SWAP False\n            \n            Set A CURRENT[\"key\"]\n            Set B NEXT[\"key\"]\n            \n            If (TYPE(A) == \"Null\" && TYPE(B) != \"Null\") {\n                Set SHOULD_SWAP True\n            } Elif (TYPE(A) != \"Null\" && TYPE(B) == \"Null\") {\n                Set SHOULD_SWAP False\n            } Elif (TYPE(A) != \"Null\" && TYPE(B) != \"Null\") {\n                // \u{4f7f}\u{7528}\u{6bd4}\u{8f83}\u{51fd}\u{6570}\u{6216}\u{9ed8}\u{8ba4}\u{6bd4}\u{8f83}\n                Set COMPARE_RESULT 0\n                \n                If (TYPE(ORDER) == \"Function\") {\n                    // \u{4f7f}\u{7528}\u{63d0}\u{4f9b}\u{7684}\u{6bd4}\u{8f83}\u{51fd}\u{6570}\n                    Set COMPARE_RESULT ORDER(A, B)\n                } Else {\n                    // \u{9ed8}\u{8ba4}\u{667a}\u{80fd}\u{6bd4}\u{8f83}\u{ff1a}\u{5c1d}\u{8bd5}\u{6309}\u{6570}\u{503c}\u{6bd4}\u{8f83}\u{6570}\u{5b57}\u{5b57}\u{7b26}\u{4e32}\u{ff0c}\u{5426}\u{5219}\u{6309}\u{5b57}\u{7b26}\u{4e32}\u{6bd4}\u{8f83}\n                    Set A_IS_NUM False\n                    Set B_IS_NUM False\n                    \n                    If (TYPE(A) == \"Number\") {\n                        Set A_IS_NUM True\n                    } Elif (TYPE(A) == \"String\") {\n                        // \u{68c0}\u{67e5}\u{662f}\u{5426}\u{662f}\u{6570}\u{5b57}\u{5b57}\u{7b26}\u{4e32}\n                        Set A_STR A\n                        Set A_NUM_STR True\n                        Set IDX 0\n                        While (IDX < LEN(A_STR)) {\n                            Set CHAR CHARAT(A_STR, IDX)\n                            If (!((CHAR >= \"0\" && CHAR <= \"9\") || CHAR == \".\" || CHAR == \"-\")) {\n                                Set A_NUM_STR False\n                                Set IDX LEN(A_STR)\n                            }\n                            Set IDX (IDX + 1)\n                        }\n                        If (A_NUM_STR && LEN(A_STR) > 0) {\n                            Set A_IS_NUM True\n                            Set A TO_NUMBER(A)\n                        }\n                    }\n                    \n                    If (TYPE(B) == \"Number\") {\n                        Set B_IS_NUM True\n                    } Elif (TYPE(B) == \"String\") {\n                        // \u{68c0}\u{67e5}\u{662f}\u{5426}\u{662f}\u{6570}\u{5b57}\u{5b57}\u{7b26}\u{4e32}\n                        Set B_STR B\n                        Set B_NUM_STR True\n                        Set IDX 0\n                        While (IDX < LEN(B_STR)) {\n                            Set CHAR CHARAT(B_STR, IDX)\n                            If (!((CHAR >= \"0\" && CHAR <= \"9\") || CHAR == \".\" || CHAR == \"-\")) {\n                                Set B_NUM_STR False\n                                Set IDX LEN(B_STR)\n                            }\n                            Set IDX (IDX + 1)\n                        }\n                        If (B_NUM_STR && LEN(B_STR) > 0) {\n                            Set B_IS_NUM True\n                            Set B TO_NUMBER(B)\n                        }\n                    }\n                    \n                    // \u{6570}\u{503c}\u{6bd4}\u{8f83}\n                    If (A_IS_NUM && B_IS_NUM) {\n                        If (A > B) {\n                            Set COMPARE_RESULT 1\n                        } Elif (A < B) {\n                            Set COMPARE_RESULT -1\n                        } Else {\n                            Set COMPARE_RESULT 0\n                        }\n                    } Else {\n                        // \u{5b57}\u{7b26}\u{4e32}\u{6bd4}\u{8f83}\u{ff08}\u{8f6c}\u{6362}\u{4e3a}\u{5b57}\u{7b26}\u{4e32}\u{ff09}\n                        Set A_STR TO_STRING(A)\n                        Set B_STR TO_STRING(B)\n                        If (A_STR > B_STR) {\n                            Set COMPARE_RESULT 1\n                        } Elif (A_STR < B_STR) {\n                            Set COMPARE_RESULT -1\n                        } Else {\n                            Set COMPARE_RESULT 0\n                        }\n                    }\n                }\n                \n                // \u{5347}\u{5e8f}\u{6392}\u{5e8f}\u{ff1a}\u{5982}\u{679c} A > B \u{5219}\u{4ea4}\u{6362}\n                If (COMPARE_RESULT > 0) {\n                    Set SHOULD_SWAP True\n                }\n            }\n            \n            If (SHOULD_SWAP) {\n                // \u{4ea4}\u{6362}\n                Set TEMP SORT_ITEMS[K]\n                Set SORT_ITEMS[K] SORT_ITEMS[K + 1]\n                Set SORT_ITEMS[K + 1] TEMP\n            }\n            \n            Set K (K + 1)\n        }\n        Set J (J + 1)\n    }\n    \n    // \u{6839}\u{636e}\u{6392}\u{5e8f}\u{540e}\u{7684}\u{7d22}\u{5f15}\u{91cd}\u{65b0}\u{6392}\u{5217}\u{6570}\u{636e}\n    Set RESULT []\n    Set I 0\n    While (I < LEN(SORT_ITEMS)) {\n        Set SORT_ITEM SORT_ITEMS[I]\n        Set ORIGINAL_INDEX SORT_ITEM[\"index\"]\n        Set ORIGINAL_ROW DATA[ORIGINAL_INDEX]\n        Set RESULT PUSH(RESULT, ORIGINAL_ROW)\n        Set I (I + 1)\n    }\n    \n    Return RESULT\n}\n\n";
Expand description

CSV 数据处理