indicatorSeeds.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. // 指标映射种子解析纯函数(无副作用、无状态,不 import request)
  2. // 支持两种输入:
  3. // 1) JSON 数组:[{"rawName":"乳酸菌","definitionId":3}, ...]
  4. // 2) CSV 两列:rawName,definitionId(逗号/中文逗号分隔,空行跳过)
  5. export function parseSeedsText(text) {
  6. if (text === null || text === undefined) return []
  7. const trimmed = String(text).trim()
  8. if (!trimmed) return []
  9. // 先尝试 JSON 数组
  10. try {
  11. const parsed = JSON.parse(trimmed)
  12. if (Array.isArray(parsed)) {
  13. return parsed
  14. .map(item => {
  15. const rawName = String(item.rawName || '').trim()
  16. if (!rawName) return null
  17. return { rawName, definitionId: item.definitionId || null }
  18. })
  19. .filter(Boolean)
  20. }
  21. } catch (e) {
  22. // 非法 JSON → 走行解析(CSV 回退)
  23. }
  24. // 按行 CSV 解析
  25. const lines = trimmed.split(/\r?\n/)
  26. const seeds = []
  27. for (let i = 0; i < lines.length; i++) {
  28. const line = lines[i].trim()
  29. if (!line) continue
  30. const cols = line.split(/[,,]/)
  31. const rawName = (cols[0] || '').trim()
  32. if (!rawName) continue
  33. // 单列且含空格的多词行视为无结构文本(如被误判的 JSON 串),跳过
  34. if (cols.length === 1 && /\s/.test(rawName)) continue
  35. let definitionId = null
  36. if (cols.length > 1 && cols[1].trim() !== '') {
  37. const num = Number(cols[1].trim())
  38. if (!isNaN(num)) definitionId = num
  39. }
  40. seeds.push({ rawName, definitionId })
  41. }
  42. return seeds
  43. }