如何才能匹配出文本的行数?

我有如下内容的TXT文件

image.png


== desc.xxx >>>
11111
2222
333
== desc.xxx <<<
4
555
666
zzz
== desc.yyy >>>
rrr\
== desc.yyy <<<
ttt
iii
ppp
ooo
== desc.zzz >>>
lll
bbhhgfc

== desc.zzz <<<

我想要基于文件匹配出行数,内容如下,请问如何才能做到呢?

{
  "desc:xxx": {
    "start": 2,
    "end": 6
  },
  "desc.yyy": {
    "start": 11,
    "end": 13
  },
  "desc.zzz": {
    "start": 18,
    "end": 22
  },
  "undefined": [
    {
      "start": 1,
      "end": 1
    },
    {
      "start": 7,
      "end": 10
    },
    {
      "start": 14,
      "end": 17
    }
  ]
}
阅读 1.7k
1 个回答
// 可以将这段代码直接放到node环境下运行
fs.readFile('./1112.txt', 'utf-8', (err, data) => {
    console.log(data.split('\r\n').reduce((s, v, i, arr) => {
    if (v.match(/==.*?>>>/g)) {
        s[v.split(' ')[1]] = {start: i + 1}
        !s['undefined'] ? s['undefined'] = i !== 0 ? [{start: 1, end: i}] : [] : s['undefined'][s['undefined'].length - 1].end = i
        } else if (v.match(/==.*?<<</g)) {
        s[v.split(' ')[1]].end = i + 1
        i !== arr.length - 1 && s['undefined'].push({start: i + 2})
        }
        return s
    }, {}))
})

屏幕截图 2022-12-31 145108.png

<!-- 文件上传txt文件拿到txt内容进行数据处理 -->
<input type="file" name="file" id="files" onchange="choosefile()" />

function choosefile () {
  var file = document.getElementById('files').files[0];
  var reader = new FileReader();
  reader.readAsText(file, "UTF-8");
  reader.onload = function (e) {
  var content = e.target.result;
  //content = '\r\n== desc.xxx >>>\r\n11111\r\n2222\r\n333\r\n== desc.xxx <<<\r\n4\r\n555\r\n666\r\nzzz\r\n== desc.yyy >>>\r\nrrr\\\r\n== desc.yyy <<<\r\nttt\r\niii\r\nppp\r\nooo\r\n== desc.zzz >>>\r\nlll\r\nbbhhgfc\r\n\r\n== desc.zzz <<<'
  console.log(setData(content)); // 最后结果
}
}
function setData(str) {
  return str.split('\r\n').reduce((s, v, i, arr) => {
    if (v.match(/==.*?>>>/g)) {
      s[v.split(' ')[1]] = {start: i + 1}
      !s['undefined'] ? s['undefined'] = i !== 0 ? [{start: 1, end: i}] : [] : s['undefined'][s['undefined'].length - 1].end = i
     } else if (v.match(/==.*?<<</g)) {
      s[v.split(' ')[1]].end = i + 1
      i !== arr.length - 1 && s['undefined'].push({start: i + 2})
    }
    return s
 }, {})
}
// 这样也可以
function setData(str) {
  let newArr = str.split('\r\n').reduce((s, v, i, arr) => {
    if (v.match(/==.*?>>>/g)) {
      s[v.split(' ')[1]] = {start: i + 1}
    } else if (v.match(/==.*?<<</g)) {
      s[v.split(' ')[1]].end = i + 1
    }
    return s
  }, {})
  let valuesArr = Object.values(newArr)
  newArr.undefined = valuesArr.reduce((s, v, i) => i !== valuesArr.length - 1 && s.push({start: v.end + 1, end: valuesArr[i + 1].start - 1}) && i === 0 &&  v.start > 1 && s.unshift({start: 1, end: v.start - 1}) && s || s, [])
  return newArr
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题