Javascript 如何循环遍历文本文件中的一系列地址,并在Node.js中获取各个字段

Javascript 如何循环遍历文本文件中的一系列地址,并在Node.js中获取各个字段,javascript,node.js,Javascript,Node.js,我有一个文本文件,其中包含以下格式的多个地址: 335阿汉街 美国海恩斯市30721 786 Birchmount Dr. 乔治亚州滑铁卢52001 我如何在Node.js中循环这些行并获得街道编号、街道名称、城市、州、邮政编码等单个字段 const fs = require('fs'); const readline = require('readline'); const parseAddressFile = path => { const data = readline.cre

我有一个文本文件,其中包含以下格式的多个地址:

335阿汉街
美国海恩斯市30721

786 Birchmount Dr.
乔治亚州滑铁卢52001

我如何在Node.js中循环这些行并获得街道编号、街道名称、城市、州、邮政编码等单个字段

const fs = require('fs');
const readline = require('readline');

const parseAddressFile = path => {
  const data = readline.createInterface({
    input: fs.createReadStream(path)
  });
  
  data.on('line', (line)=> {
    var address1= line.split(" ")[0];
    
    console.log(address1)
  })
};

我正在使用readline模块,我基本上被困在这之后。

您可以使用带有命名组的
正则表达式来尝试这样做,只要您有上述格式的地址

const fs=require('fs');
const readline=require('readline');
const parseAddressFile=path=>{
const data=readline.createInterface({
输入:fs.createReadStream(路径)
});
让地址={};
常量地址列表=[];
data.on('行',(行)=>{
如果(行){
常数temp=line.match(/^((?\d+)(.+)|(?。+),(?[A-Z]+)(?\d{5,5}))$/);
地址=对象键(临时组)。减少((acc,键)=>{
if(临时组[键]){
acc[键]=临时组[键];
}
返回acc;
},地址|{});
}否则{
地址列表。推送(地址);
地址=空;
}
}).on('关闭')功能(行){
如果(地址){
地址列表。推送(地址);
}
控制台日志(地址列表);
});
};

parseAddressFile('address.txt')
我喜欢将以下内容视为“蓝领”编码。它不会赢得任何奖项,但它确实做到了。它是这样写的,任何人只要看一眼就可以知道发生了什么。如前所述,它在前端工作,从“文件”字符串中提取地址。如果从注释掉的三行中删除正斜杠,并更改:

const address = parseAddressFile('file'); to    
const address = parseAddressFile('addresses.txt');     
或者,无论文本文件名是什么,您都可以在后端使用它

以下代码假定地址的格式正确

文件=
`主街123号。
不知道,明尼苏达州55414
第一街234号。
不在这里,SD 61743
147 Johnson Pkwy
加利福尼亚州洛杉矶90217
`;
const parseAddressFile=path=>{
//常数fs=要求('fs');
//const file=fs.readFileSync(path.toString('utf-8');
让address=[],tmp,obj,object={};
object=file.matchAll(//^.+$/mg);//删除空行
object=Array.from(对象);
for(让输入对象){
if(tmp=object[key][0]。匹配(/^(?\d+(.*)$/){
obj={streetNumber:tmp.groups.streetNumber,streetName:tmp.groups.streetName}
}否则
如果(tmp=object[key][0]。匹配(/^(?.*),(?\w.*)(?[\d\-]+)$/){
obj['city']=tmp.groups.city,
obj['state']=tmp.groups.state,
obj['postalCode']=tmp.groups.postalCode;
地址推送(obj);
obj=null;
}else{console.error('No Match Found')}
}回信地址;
}
//const address=parseAddressFile('addresses.txt');
const address=parseAddressFile(“文件”);

控制台日志(地址)上面的代码非常好。但是如果streetName不是以“.”结尾,正则表达式就会失败。我可以通过更改:address=Object.keys(temp.groups)。reduce((acc,key)=>{到if(temp){address=Object.keys(temp.groups)。reduce((acc,key)=>{并从(?.+\)结尾删除“\”谢谢@VikingGlen,更新的代码片段。虽然我只是添加了一些匹配精确模式的代码,但它可能不是必需的。