如何从这种String中获取关键字

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从这种String中获取关键字相关的知识,希望对你有一定的参考价值。

我需要从这种字符串中获取“付款类型和客户类型”

   Examples:
      |    D           | A  | B | C |
      |      NZ       | AAA           |     BBB    |      NZ       |
      |      AZ       | CCC           |    DDD        |  AZ  |
      |      CA      | EEE            |    FFF        |  CA  |



我应该尝试获取模式并为此编写函数吗?或者我可以找到一些库来检测它

所以输出应该是{payment:[“AAA”,“CCC”,“EEE”],客户:[“BBB”,“DDD”,“FFF”]}

function detect(str){
  let countBar=1
  let countBar2=0
  let paymentLoc=NaN
  let customerLoc=NaN
  let after =0
  let arr1=str.split(" ")
  arr1=arr1.filter(item=>{return item!==""})
  let newStr=''
  for(let i=0;i<arr1.length;i++){
    arr1[i].trim()
    if(arr1[i]==='|'){
      countBar++
    }
    if(arr1[i]==="||"){
      countBar2++
    }
    if(arr1[i].includes("payment")){
      paymentLoc=i
    }

   after=((countBar/(countBar2))-1)*2
let sol=[]
  for(let i=0;i<arr1.length;i++){
  if(arr1[i].includes("payment")){
    console.log('payment index',i)
      sol.push(arr1[i+after+1])
    }
    if(arr1[i].includes("customer")){
      console.log('customer index',i)
      sol.push(arr1[i+after+1])
    }


  }


  newStr=arr1.join('')
  console.log(newStr)


}
答案

我对这个玩得很开心。我的第一个想法是使用npm包,因为字符串看起来很像CSV,|作为分隔符。包csvtojson是一个很好的,但为什么当你可以一起破解时使用一个备受推崇的库?

这是我的第一次尝试(在Typescript中):

const exampleString = ` | market | payment type | customer type | translation |
                        | NZ     | AAA          | BBB           | NZ          |
                        | AZ     | CCC          | DDD           | AZ          |
                        | CA     | EEE          | FFF           | CA          |`;

const cleanColumn = (col: string) =>
  col
    .replace("|", "")
    .trim()
    .replace(/s/, "_");

const cleanRow = (row: string) =>
  row
    .split(/s|/)
    .map(cleanColumn)
    .filter(Boolean);

const pivotRows = (
  pivoted: string[][],
  currentRow: string[],
  rowIndex: number
) => {
  if (rowIndex === 0) {
    currentRow.forEach((col, colIndex) => {
      pivoted[colIndex] = [col];
    });
  } else {
    currentRow.forEach((col, colIndex) => {
      pivoted[colIndex].push(col);
    });
  }

  return pivoted;
};

const buildObject = (
  obj: { [key: string]: string[] },
  currentRow: string[]
) => {
  let currentCol: string;

  currentRow.forEach((col, index) => {
    if (index === 0) {
      currentCol = col;

      obj[currentCol] = [];
    } else {
      obj[currentCol].push(col);
    }
  });

  return obj;
};

const detect = (str: string) =>
  str
    .split("
")
    .map(cleanRow)
    .reduce(pivotRows, [])
    .reduce(buildObject, {});

console.log(detect(exampleString));

如果你看看detect,它只是在字符串上执行一系列函数。第一个只是通过换行符拆分它。我喜欢你用countBar变量的目的,但这似乎更容易。

这给了我们一堆字符串数组,需要分解成列。在这里,我使用了一些RegEx来分隔space|组合之间的所有内容。在cleanColumn()中,我删除剩余的|s,以防有任何落后者,然后用下划线替换空格,以便它们可以用作对象键。

然后,用.filter(Boolean)技巧(link)删除空字符串。最后两个函数可能比必要的更冗长,但它们完成了这项工作。 pivotRows()使用行索引和列索引将列转换为行。最后,在buildObject()中,每个行的第一个元素被添加为对象的键,其余的值被推送到字符串数组中。

真的,你应该只使用csvtojson

另一答案

这是一个只是通过|分裂的尝试。

var text = `|    market     | payment type  | customer type |  translation  |
  |      NZ       | AAA           |     BBB    |      NZ       |
  |      AZ       | CCC           |    DDD        |  AZ  |
  |      CA      | EEE            |    FFF        |  CA  |`;

var result = {
    payment: text.split('|').filter((f, i) => i-7 >= 0 && (i - 7) % 5 == 0)
       .map(p => p.trim()),
    customer: text.split('|').filter((f, i) => i-8 >= 0 && (i - 8) % 5 == 0)
       .map(p => p.trim())
}

console.log(result)

以上是关于如何从这种String中获取关键字的主要内容,如果未能解决你的问题,请参考以下文章

从视图/控制器获取 pimcore 片段名称

如何从设置中获取数据并发送到此片段

从 ViewPager 中检索片段

如何从片段中的 JSON 响应中的对象获取数据

如何从该片段中的 onItemSelectedListener 中获取微调器单击的项目?

如何从 Kotlin 中的 Hashmap 获取值的关键?