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 数据处理