返回

CSV 查看与清洗

数据互转

正在载入

正在加载工具

正在准备工具,暂时无法估算剩余时间。

本工具的全部运算都发生在你的浏览器中,输入内容不会发送到任何服务器。

关于这个工具

先查看 CSV 或 TSV 导出表,再决定哪些数据需要修改。按位置选择同一组值处理列,去除两端空白、替换已有空单元格或指定文本,并按需用明确的输入和输出格式统一日期。可选的空行删除和组合键去重在这些值变换之后执行。对照原始与清洗后预览,检查各步骤计数和无效日期示例,再下载结果。原始解析数据始终保持不变,可重置规则后重新处理。整个流程在浏览器本地 Worker 中运行。

常见用途

  • 清理客户导出表中的姓名和编号两端空白,替换已知的 N/A 标记,并在导入其他系统前核对受影响的单元格。
  • 将已知的 DD/MM/YYYY 日期列统一成 YYYY-MM-DD,保留并报告不可能的日期,不猜测日月顺序或转换时区。
  • 删除整行为空的记录,按组合键保留首条、末条或删除全部重复组,同时区分 001 与 1 并保持原始行顺序。

使用方法

  1. 1.粘贴分隔文本或选择 UTF-8 文件,明确选择逗号或制表符,以及首条记录是否为表头。启用修改前先检查解析表格;允许空表头、重复表头和长短不齐的行。按列位置选择字段,避免重名造成歧义。
  2. 2.只启用需要的规则。同一组所选列会接受全部已启用的值处理:去空白、空单元格/精确文本替换、日期转换。按需指定替换字符串和日期输入/输出格式。启用日期时只应选择日期列;同组列中其他非空文本会被报告为无效日期。执行顺序固定为去空白 → 替换 → 日期 → 删除空行 → 去重。替换按整个单元格区分大小写精确匹配,替换内容可以为空字符串。
  3. 3.去重时选择一个或多个键列,再选择保留首条、保留末条或删除重复键组的全部行。执行清洗,对照前后数据和各步骤计数,检查保持不变的无效日期及保留行的原始行号。输入或设置变更会使旧结果失效;重新执行始终从原始输入开始。重置会移除清洗规则,而不是对结果执行逆向变换。 下载清洗后的 CSV/TSV 或包含行数组的 JSON 报告。输入时的表头设置决定 CSV/TSV 是否包含未经修改的原始表头;无表头输入不会在导出时新增表头。数据列保持原顺序。用于表格软件查看时应保留公式防护;原始导出须明确选择并注意警告。JSON 保留解析后的字符串及不等长的行。清空会从工具中移除当前输入和结果。

CSV 清洗实用示例

仅去除所选列两端空白

{
  "input": "id,name,note\n 001 , Alice , keep \n1,Bob, as is ",
  "parseOptions": {
    "delimiter": ",",
    "header": true
  },
  "options": {
    "columns": [
      0,
      1
    ],
    "trim": true,
    "nulls": {
      "enabled": false,
      "tokens": [],
      "replaceEmpty": false,
      "replacement": ""
    },
    "dates": {
      "enabled": false,
      "inputFormat": "YYYY-MM-DD",
      "outputFormat": "YYYY-MM-DD"
    },
    "removeEmptyRows": false,
    "dedupe": {
      "enabled": false,
      "columns": [],
      "keep": "first"
    }
  }
}
{
  "headers": [
    "id",
    "name",
    "note"
  ],
  "hasHeader": true,
  "columnCount": 3,
  "rows": [
    [
      "001",
      "Alice",
      " keep "
    ],
    [
      "1",
      "Bob",
      " as is "
    ]
  ],
  "summary": {
    "inputRows": 2,
    "outputRows": 2,
    "columns": 3,
    "trimmedCells": 2,
    "replacedCells": 0,
    "convertedDates": 0,
    "invalidDates": 0,
    "emptyRowsRemoved": 0,
    "duplicateRowsRemoved": 0,
    "duplicateGroups": 0,
    "changedCells": 2,
    "changedRows": 1
  },
  "sourceRows": [
    1,
    2
  ]
}

选择第 1、2 列(示例中的零基索引为 0、1)。id 和 name 两端的不换行空格、全角空格被去除;未选择的 note 保留空白,编号仍为字符串 001。

区分空单元格、指定标记与缺失

{
  "input": "id,value\n1,\n2,N/A\n3,null\n4\n5,n/a",
  "parseOptions": {
    "delimiter": ",",
    "header": true
  },
  "options": {
    "columns": [
      1
    ],
    "trim": false,
    "nulls": {
      "enabled": true,
      "tokens": [
        "N/A"
      ],
      "replaceEmpty": true,
      "replacement": "(missing)"
    },
    "dates": {
      "enabled": false,
      "inputFormat": "YYYY-MM-DD",
      "outputFormat": "YYYY-MM-DD"
    },
    "removeEmptyRows": false,
    "dedupe": {
      "enabled": false,
      "columns": [],
      "keep": "first"
    }
  }
}
{
  "headers": [
    "id",
    "value"
  ],
  "hasHeader": true,
  "columnCount": 2,
  "rows": [
    [
      "1",
      "(missing)"
    ],
    [
      "2",
      "(missing)"
    ],
    [
      "3",
      "null"
    ],
    [
      "4"
    ],
    [
      "5",
      "n/a"
    ]
  ],
  "summary": {
    "inputRows": 5,
    "outputRows": 5,
    "columns": 2,
    "trimmedCells": 0,
    "replacedCells": 2,
    "convertedDates": 0,
    "invalidDates": 0,
    "emptyRowsRemoved": 0,
    "duplicateRowsRemoved": 0,
    "duplicateGroups": 0,
    "changedCells": 2,
    "changedRows": 2
  },
  "sourceRows": [
    1,
    2,
    3,
    4,
    5
  ]
}

已有空单元格和大写 N/A 替换成 (missing)。第 4 行缺失的行尾字段仍然缺失;字面文本 null 和小写 n/a 不匹配指定标记,保持原字符串。

转换日优先日期,不自动修复无效值

{
  "input": "id,date\nA,29/02/2024\nB,29/02/2023\nC,31/04/2024\nD,01/02/2024\nE,\nF,1/2/2024",
  "parseOptions": {
    "delimiter": ",",
    "header": true
  },
  "options": {
    "columns": [
      1
    ],
    "trim": false,
    "nulls": {
      "enabled": false,
      "tokens": [],
      "replaceEmpty": false,
      "replacement": ""
    },
    "dates": {
      "enabled": true,
      "inputFormat": "DD/MM/YYYY",
      "outputFormat": "YYYY-MM-DD"
    },
    "removeEmptyRows": false,
    "dedupe": {
      "enabled": false,
      "columns": [],
      "keep": "first"
    }
  }
}
{
  "headers": [
    "id",
    "date"
  ],
  "hasHeader": true,
  "columnCount": 2,
  "rows": [
    [
      "A",
      "2024-02-29"
    ],
    [
      "B",
      "29/02/2023"
    ],
    [
      "C",
      "31/04/2024"
    ],
    [
      "D",
      "2024-02-01"
    ],
    [
      "E",
      ""
    ],
    [
      "F",
      "1/2/2024"
    ]
  ],
  "summary": {
    "inputRows": 6,
    "outputRows": 6,
    "columns": 2,
    "trimmedCells": 0,
    "replacedCells": 0,
    "convertedDates": 2,
    "invalidDates": 3,
    "emptyRowsRemoved": 0,
    "duplicateRowsRemoved": 0,
    "duplicateGroups": 0,
    "changedCells": 2,
    "changedRows": 2
  },
  "sourceRows": [
    1,
    2,
    3,
    4,
    5,
    6
  ]
}

2024 年闰日和 2 月 1 日成功转换。2023 年闰日、4 月 31 日及位数不足的 1/2/2024 保持原样,共计 3 个无效单元格。空字符串跳过,不计为无效日期。

明确选择月优先含义

{
  "input": "date\n01/02/2024\n12/31/2024",
  "parseOptions": {
    "delimiter": ",",
    "header": true
  },
  "options": {
    "columns": [
      0
    ],
    "trim": false,
    "nulls": {
      "enabled": false,
      "tokens": [],
      "replaceEmpty": false,
      "replacement": ""
    },
    "dates": {
      "enabled": true,
      "inputFormat": "MM/DD/YYYY",
      "outputFormat": "YYYY-MM-DD"
    },
    "removeEmptyRows": false,
    "dedupe": {
      "enabled": false,
      "columns": [],
      "keep": "first"
    }
  }
}
{
  "headers": [
    "date"
  ],
  "hasHeader": true,
  "columnCount": 1,
  "rows": [
    [
      "2024-01-02"
    ],
    [
      "2024-12-31"
    ]
  ],
  "summary": {
    "inputRows": 2,
    "outputRows": 2,
    "columns": 1,
    "trimmedCells": 0,
    "replacedCells": 0,
    "convertedDates": 2,
    "invalidDates": 0,
    "emptyRowsRemoved": 0,
    "duplicateRowsRemoved": 0,
    "duplicateGroups": 0,
    "changedCells": 2,
    "changedRows": 2
  },
  "sourceRows": [
    1,
    2
  ]
}

这里选择 MM/DD/YYYY,01/02/2024 表示 1 月 2 日。若选择 DD/MM/YYYY,同一字符串会表示 2 月 1 日。工具不会推断数据来源采用哪种约定。

检查世纪闰年与四位年份范围

{
  "input": "date\n0001/01/01\n2000/02/29\n1900/02/29\n0000/01/01\n9999/12/31",
  "parseOptions": {
    "delimiter": ",",
    "header": true
  },
  "options": {
    "columns": [
      0
    ],
    "trim": false,
    "nulls": {
      "enabled": false,
      "tokens": [],
      "replaceEmpty": false,
      "replacement": ""
    },
    "dates": {
      "enabled": true,
      "inputFormat": "YYYY/MM/DD",
      "outputFormat": "DD/MM/YYYY"
    },
    "removeEmptyRows": false,
    "dedupe": {
      "enabled": false,
      "columns": [],
      "keep": "first"
    }
  }
}
{
  "headers": [
    "date"
  ],
  "hasHeader": true,
  "columnCount": 1,
  "rows": [
    [
      "01/01/0001"
    ],
    [
      "29/02/2000"
    ],
    [
      "1900/02/29"
    ],
    [
      "0000/01/01"
    ],
    [
      "31/12/9999"
    ]
  ],
  "summary": {
    "inputRows": 5,
    "outputRows": 5,
    "columns": 1,
    "trimmedCells": 0,
    "replacedCells": 0,
    "convertedDates": 3,
    "invalidDates": 2,
    "emptyRowsRemoved": 0,
    "duplicateRowsRemoved": 0,
    "duplicateGroups": 0,
    "changedCells": 3,
    "changedRows": 3
  },
  "sourceRows": [
    1,
    2,
    3,
    4,
    5
  ]
}

支持 0001 和 9999 年。2000 年是闰年,1900 年不是;0000 年超出本工具的日期范围。所选输出格式将日期置于月之前,不涉及任何时区。

去空白后再删除整条空记录

{
  "input": "a,b\n  , \n,\n,keep\nx",
  "parseOptions": {
    "delimiter": ",",
    "header": true
  },
  "options": {
    "columns": [
      0,
      1
    ],
    "trim": true,
    "nulls": {
      "enabled": false,
      "tokens": [],
      "replaceEmpty": false,
      "replacement": ""
    },
    "dates": {
      "enabled": false,
      "inputFormat": "YYYY-MM-DD",
      "outputFormat": "YYYY-MM-DD"
    },
    "removeEmptyRows": true,
    "dedupe": {
      "enabled": false,
      "columns": [],
      "keep": "first"
    }
  }
}
{
  "headers": [
    "a",
    "b"
  ],
  "hasHeader": true,
  "columnCount": 2,
  "rows": [
    [
      "",
      "keep"
    ],
    [
      "x"
    ]
  ],
  "summary": {
    "inputRows": 4,
    "outputRows": 2,
    "columns": 2,
    "trimmedCells": 2,
    "replacedCells": 0,
    "convertedDates": 0,
    "invalidDates": 0,
    "emptyRowsRemoved": 2,
    "duplicateRowsRemoved": 0,
    "duplicateGroups": 0,
    "changedCells": 2,
    "changedRows": 1
  },
  "sourceRows": [
    3,
    4
  ]
}

第一条数据行去空白后全为空,第二条原本就是空行,因此删除两条。第三条仍有 keep,第四条虽短但有 x,均保留,原始数据行号为 3、4。

按固定顺序处理,理解逐步计数

{
  "input": "date,note\n 01/02/2024 ,first\nN/A,replacement\n,\n01/02/2024,last",
  "parseOptions": {
    "delimiter": ",",
    "header": true
  },
  "options": {
    "columns": [
      0
    ],
    "trim": true,
    "nulls": {
      "enabled": true,
      "tokens": [
        "N/A"
      ],
      "replaceEmpty": false,
      "replacement": "01/02/2024"
    },
    "dates": {
      "enabled": true,
      "inputFormat": "DD/MM/YYYY",
      "outputFormat": "YYYY-MM-DD"
    },
    "removeEmptyRows": true,
    "dedupe": {
      "enabled": true,
      "columns": [
        0
      ],
      "keep": "first"
    }
  }
}
{
  "headers": [
    "date",
    "note"
  ],
  "hasHeader": true,
  "columnCount": 2,
  "rows": [
    [
      "2024-02-01",
      "first"
    ]
  ],
  "summary": {
    "inputRows": 4,
    "outputRows": 1,
    "columns": 2,
    "trimmedCells": 1,
    "replacedCells": 1,
    "convertedDates": 3,
    "invalidDates": 0,
    "emptyRowsRemoved": 1,
    "duplicateRowsRemoved": 2,
    "duplicateGroups": 1,
    "changedCells": 3,
    "changedRows": 3
  },
  "sourceRows": [
    1
  ]
}

只选择 date 列。先去空白、替换 N/A,再转换日期,因此第 1、2、4 行得到相同日期键。第 3 行为空而被删除,保留首条去重最终留下第 1 行。即使最后只有一行,日期转换仍计 3 次;各步骤计数会重叠。

保留末条,同时维持原始顺序

{
  "input": "key,value\nA,first\nB,middle\nA,last\nC,tail\nB,final",
  "parseOptions": {
    "delimiter": ",",
    "header": true
  },
  "options": {
    "columns": [],
    "trim": false,
    "nulls": {
      "enabled": false,
      "tokens": [],
      "replaceEmpty": false,
      "replacement": ""
    },
    "dates": {
      "enabled": false,
      "inputFormat": "YYYY-MM-DD",
      "outputFormat": "YYYY-MM-DD"
    },
    "removeEmptyRows": false,
    "dedupe": {
      "enabled": true,
      "columns": [
        0
      ],
      "keep": "last"
    }
  }
}
{
  "headers": [
    "key",
    "value"
  ],
  "hasHeader": true,
  "columnCount": 2,
  "rows": [
    [
      "A",
      "last"
    ],
    [
      "C",
      "tail"
    ],
    [
      "B",
      "final"
    ]
  ],
  "summary": {
    "inputRows": 5,
    "outputRows": 3,
    "columns": 2,
    "trimmedCells": 0,
    "replacedCells": 0,
    "convertedDates": 0,
    "invalidDates": 0,
    "emptyRowsRemoved": 0,
    "duplicateRowsRemoved": 2,
    "duplicateGroups": 2,
    "changedCells": 0,
    "changedRows": 0
  },
  "sourceRows": [
    3,
    4,
    5
  ]
}

A 的末条为原始第 3 行,B 的末条为第 5 行,唯一的 C 位于第 4 行。因此输出为 A、C、B,按保留行的原始顺序排列,而不是按键分组输出 A、B、C。

删除重复键组中的全部行

{
  "input": "key,value\nA,first\nB,middle\nA,last\nC,tail\nB,final",
  "parseOptions": {
    "delimiter": ",",
    "header": true
  },
  "options": {
    "columns": [],
    "trim": false,
    "nulls": {
      "enabled": false,
      "tokens": [],
      "replaceEmpty": false,
      "replacement": ""
    },
    "dates": {
      "enabled": false,
      "inputFormat": "YYYY-MM-DD",
      "outputFormat": "YYYY-MM-DD"
    },
    "removeEmptyRows": false,
    "dedupe": {
      "enabled": true,
      "columns": [
        0
      ],
      "keep": "none"
    }
  }
}
{
  "headers": [
    "key",
    "value"
  ],
  "hasHeader": true,
  "columnCount": 2,
  "rows": [
    [
      "C",
      "tail"
    ]
  ],
  "summary": {
    "inputRows": 5,
    "outputRows": 1,
    "columns": 2,
    "trimmedCells": 0,
    "replacedCells": 0,
    "convertedDates": 0,
    "invalidDates": 0,
    "emptyRowsRemoved": 0,
    "duplicateRowsRemoved": 4,
    "duplicateGroups": 2,
    "changedCells": 0,
    "changedRows": 0
  },
  "sourceRows": [
    4
  ]
}

none 策略表示重复组不保留任何成员,不是关闭去重。两条 A 和两条 B 都被删除,只保留键唯一的 C 行。

组合键保留字符串、前导零与缺失差异

{
  "input": "region,id\nnorth,001\nnorth,1\nsouth,001\nnorth,001\nnorth\nnorth,\na|b,c\na,b|c",
  "parseOptions": {
    "delimiter": ",",
    "header": true
  },
  "options": {
    "columns": [],
    "trim": false,
    "nulls": {
      "enabled": false,
      "tokens": [],
      "replaceEmpty": false,
      "replacement": ""
    },
    "dates": {
      "enabled": false,
      "inputFormat": "YYYY-MM-DD",
      "outputFormat": "YYYY-MM-DD"
    },
    "removeEmptyRows": false,
    "dedupe": {
      "enabled": true,
      "columns": [
        0,
        1
      ],
      "keep": "first"
    }
  }
}
{
  "headers": [
    "region",
    "id"
  ],
  "hasHeader": true,
  "columnCount": 2,
  "rows": [
    [
      "north",
      "001"
    ],
    [
      "north",
      "1"
    ],
    [
      "south",
      "001"
    ],
    [
      "north"
    ],
    [
      "north",
      ""
    ],
    [
      "a|b",
      "c"
    ],
    [
      "a",
      "b|c"
    ]
  ],
  "summary": {
    "inputRows": 8,
    "outputRows": 7,
    "columns": 2,
    "trimmedCells": 0,
    "replacedCells": 0,
    "convertedDates": 0,
    "invalidDates": 0,
    "emptyRowsRemoved": 0,
    "duplicateRowsRemoved": 1,
    "duplicateGroups": 1,
    "changedCells": 0,
    "changedRows": 0
  },
  "sourceRows": [
    1,
    2,
    3,
    5,
    6,
    7,
    8
  ]
}

只有第 4 行重复了完整的 north + 001 键。001 与 1 不同;north 配缺失 id 与 north 配空 id 也不同。[a|b, c] 和 [a, b|c] 是不同元组,不会因拼接分隔符而冲突。

保留重名表头、不等长行与引号文本

{
  "input": ",name,name\n001,\"A, \"\"B\"\"\",\"line1\nline2\"\n002,x\n003,,tail,extra",
  "parseOptions": {
    "delimiter": ",",
    "header": true
  },
  "options": {
    "columns": [],
    "trim": false,
    "nulls": {
      "enabled": false,
      "tokens": [],
      "replaceEmpty": false,
      "replacement": ""
    },
    "dates": {
      "enabled": false,
      "inputFormat": "YYYY-MM-DD",
      "outputFormat": "YYYY-MM-DD"
    },
    "removeEmptyRows": false,
    "dedupe": {
      "enabled": false,
      "columns": [],
      "keep": "first"
    }
  }
}
{
  "headers": [
    "",
    "name",
    "name"
  ],
  "hasHeader": true,
  "columnCount": 4,
  "rows": [
    [
      "001",
      "A, \"B\"",
      "line1\nline2"
    ],
    [
      "002",
      "x"
    ],
    [
      "003",
      "",
      "tail",
      "extra"
    ]
  ],
  "summary": {
    "inputRows": 3,
    "outputRows": 3,
    "columns": 4,
    "trimmedCells": 0,
    "replacedCells": 0,
    "convertedDates": 0,
    "invalidDates": 0,
    "emptyRowsRemoved": 0,
    "duplicateRowsRemoved": 0,
    "duplicateGroups": 0,
    "changedCells": 0,
    "changedRows": 0
  },
  "sourceRows": [
    1,
    2,
    3
  ]
}

空表头和重复表头保持原样。尽管表头只有三列,最长数据行仍使表格宽度为四列。引号中的逗号、双写引号和内嵌换行解析为单元格文本,存储结果不会为短行补空值。

按位置清理无表头 TSV

{
  "input": "001\t x \n1\ty\n001\t x ",
  "parseOptions": {
    "delimiter": "\t",
    "header": false
  },
  "options": {
    "columns": [
      1
    ],
    "trim": true,
    "nulls": {
      "enabled": false,
      "tokens": [],
      "replaceEmpty": false,
      "replacement": ""
    },
    "dates": {
      "enabled": false,
      "inputFormat": "YYYY-MM-DD",
      "outputFormat": "YYYY-MM-DD"
    },
    "removeEmptyRows": false,
    "dedupe": {
      "enabled": true,
      "columns": [
        0
      ],
      "keep": "first"
    }
  }
}
{
  "headers": [
    "column1",
    "column2"
  ],
  "hasHeader": false,
  "columnCount": 2,
  "rows": [
    [
      "001",
      "x"
    ],
    [
      "1",
      "y"
    ]
  ],
  "summary": {
    "inputRows": 3,
    "outputRows": 2,
    "columns": 2,
    "trimmedCells": 2,
    "replacedCells": 0,
    "convertedDates": 0,
    "invalidDates": 0,
    "emptyRowsRemoved": 0,
    "duplicateRowsRemoved": 1,
    "duplicateGroups": 1,
    "changedCells": 2,
    "changedRows": 2
  },
  "sourceRows": [
    1,
    2
  ]
}

明确选择制表符,并保留首条记录为数据。生成的 column1、column2 只是列标签,不会插入 CSV 表头。去除第 2 列两端空白后按第 1 列去重,001 与 1 仍是不同编号。

仅在防公式 CSV 导出时添加前缀

{
  "input": "=header,value\n=1+1,001\n@cmd,\"line1\nline2\"\n  +2,",
  "parseOptions": {
    "delimiter": ",",
    "header": true
  },
  "options": {
    "columns": [],
    "trim": false,
    "nulls": {
      "enabled": false,
      "tokens": [],
      "replaceEmpty": false,
      "replacement": ""
    },
    "dates": {
      "enabled": false,
      "inputFormat": "YYYY-MM-DD",
      "outputFormat": "YYYY-MM-DD"
    },
    "removeEmptyRows": false,
    "dedupe": {
      "enabled": false,
      "columns": [],
      "keep": "first"
    }
  },
  "export": {
    "format": "csv",
    "safe": true,
    "delimiter": ","
  }
}
{
  "headers": [
    "=header",
    "value"
  ],
  "hasHeader": true,
  "columnCount": 2,
  "rows": [
    [
      "=1+1",
      "001"
    ],
    [
      "@cmd",
      "line1\nline2"
    ],
    [
      "  +2",
      ""
    ]
  ],
  "summary": {
    "inputRows": 3,
    "outputRows": 3,
    "columns": 2,
    "trimmedCells": 0,
    "replacedCells": 0,
    "convertedDates": 0,
    "invalidDates": 0,
    "emptyRowsRemoved": 0,
    "duplicateRowsRemoved": 0,
    "duplicateGroups": 0,
    "changedCells": 0,
    "changedRows": 0
  },
  "sourceRows": [
    1,
    2,
    3
  ],
  "exported": "\"'=header\",\"value\"\r\n\"'=1+1\",\"001\"\r\n\"'@cmd\",\"line1\nline2\"\r\n\"'  +2\",\"\""
}

清洗结果仍保留原字符串;防公式 CSV 序列化时才给类似公式的表头和单元格添加单引号,包括前面带空格的 +2。所有字段加双引号,记录间使用 CRLF。此防护不能强制表格软件将 001 保留为文本。

CSV 清洗常见错误

  • 只看重复的表头名称,没有核对实际列位置。
  • 误以为去空白会删除内部空格、零宽字符或全部 Unicode 格式字符。
  • 将行尾缺失字段、空字符串和字面文本 null 当作同一值。
  • 为日/月/年数据选择 MM/DD/YYYY,或以为无效日期会被自动修复。
  • 忽略去空白或替换可能让原本不同的去重键变得相同。
  • 希望保留一条代表记录,却选择删除全部重复组。
  • 直接相加各步骤计数,误以为每个受影响单元格或删除行只计数一次。
  • 在表格软件中打开不可信的原始 CSV,或以为双引号能保留编号的前导零。

限制与说明

  • 输入上限为 2 MiB 文件字节和 2 MiB 解码后的 UTF-8 文本、10,000 条数据行、128 列和 200,000 个单元格。导出及中间变换数据预算上限为 12 MiB;过大的替换值可能在后续删除行之前就被拒绝。超过限制会阻止操作,不会静默截断。Worker、有限预览、取消和超时机制可减少负载,但并非严格的浏览器内存隔离。较大文件请使用本地数据工具。 分隔符需明确选择逗号或制表符,不自动检测。UTF-8 文件可带 BOM;错误引号或无效 UTF-8 会报错。支持带引号的分隔符、双写引号、多行字段、空或重复表头、无表头输入及不等长记录。行尾缺失字段仍然缺失,预览中的补白不是新增空值。表头不会被清洗、重命名或去重。
  • 去空白使用 ECMAScript trim(),仅处理所选已有单元格两端的空白,包括不换行空格和全角空格;不压缩内部空格,不删除所有不可见字符,不做 Unicode 规范化或大小写转换。替换对去空白后的完整字符串精确匹配,每个命中单元格只替换一次。CSV 没有 null 类型:空文本、缺失单元格以及 null、N/A 等字面字符串各不相同。缺失字段不会被填充;只有明确指定的文本标记才会被替换。 步骤计数仅在该步真正改变字符串时增加;已符合输出格式的有效日期或替换成相同值不算修改。它们不是整个流程中互不重复的单元格总数。同一单元格可能先去空白再替换,所在行最后又被删除。净变更单元格数和行数在删除行之前,以最终规范化值与原值比较。原始输入独立保留,重置与重新执行都以它为起点,修改不会层层累积;不能先处理一组列,再以另一次选择累加处理。这是确定的规则流程,不是多步撤销历史、模糊匹配、数值转换、大小写折叠或自动纠错。
  • 日期仅支持 YYYY-MM-DD、DD/MM/YYYY、MM/DD/YYYY、YYYY/MM/DD,要求位数完全一致,且是 0001–9999 年范围内的有效前推公历日期。输入和输出格式必须明确指定;不猜测地区格式,不解析时间戳,不转换时区,也不会自行解释 01/02/2024。无效的所选非空单元格保持原样并计数,提供有限示例;空字符串和缺失单元格跳过。去除两端空白后,带空格的日期可能变为可转换值。
  • 删除空行在值规范化之后执行,仅当某行所有已有单元格都为长度为零的字符串时删除。空白字符不等于空字符串,除非所选去空白操作将其去除;替换为非空值可能使该行不再被删除。去重比较此前各步骤处理后的指定位置列组成的元组,保留 001 与 1、缺失与空字符串的区别。首条/末条保留对应成员,删除全部重复组只留下键唯一的行;保留行仍按原始顺序输出。 预览搜索、筛选和排序仅影响显示;导出包含全部保留行,并按原始顺序排列。
  • 防公式 CSV 会给类似公式的字段加单引号前缀,因此会改变导出的文本。原始 CSV 在表格软件中打开时可能执行公式;仅用双引号包裹不足以防护,保存后重新打开也可能丢失防护。表格软件还可能重新解释带前导零的编号。需要精确字符串交换时优先选择 JSON 数组;缺失的行尾字段表现为较短数组,不会变为 null。JSON 报告包含 hasHeader、headers、columnCount 和 rows,不会用可能重名的表头把数据转成对象。输入表头设置决定 CSV/TSV 是否输出表头,列顺序保持不变。两种导出都不保留原始引号形式、编码字节或记录换行符。本工具不上传或持久保存输入数据;下载后的文件不再受页面控制。

常见问题

重置能恢复清洗删除的数据吗?

在当前输入仍保留时可以。清洗不会覆盖原始解析行;重置会清除规则和结果,之后可再次查看或处理原始数据。修改规则后重新执行也从原始数据开始。清空会移除输入和结果,并不提供可恢复的编辑历史。

01/02/2024 会转换成什么?

输入选择 DD/MM/YYYY、输出选择 YYYY-MM-DD 时会得到 2024-02-01;输入选择 MM/DD/YYYY 时则得到 2024-01-02。工具不会代替你选择日月顺序。31/02/2024 等不存在的日期保持不变,并计入无效日期。

重复行如何选择和排序?

按位置选择键列;此前清洗步骤完成后,所有选定值组成一个组合键。保留首条取最早的行,保留末条取最后的行,删除全部重复组会删除该组每一行。保留行按原始顺序输出,不按键分组重新排列。001 与 1、缺失与空字符串仍视为不同键值。

防公式 CSV 在所有表格软件中都安全吗?

无法作出通用保证。默认单引号前缀可降低公式解释风险,也会有意改变危险字段。原始导出不含这层防护;表格应用可能重新解释数据,或在保存后丢失防护。应审查不可信数据,需要精确保留字符串时优先使用 JSON。

相关工具