【输入输出处理】JavaScript-Node-acm模式

2,590 阅读3分钟

2022.5.20 更新

今天来上工了,这次用readFile,writeFile函数读数据,存为二维矩阵形式。

数据格式大概长这样:

 ALFA      Cnor Cm    CY    Cn  Cl  M= 0.30  H=00000 DLTE=-30.0  全量、基本量、舵偏增量
0.000000  0.000000  0.000000 0.000000  0.000000  0.000000 1.111111  0.000000  0.000000
0.000000  0.000000  0.000000 0.000000  0.000000  0.000000 1.111111  0.000000  0.000000
...
 ALFA      Cnor Cm    CY    Cn  Cl  M= 0.30  H=00000 DLTE=-20.0  全量、基本量、舵偏增量
0.000000  0.000000  0.000000 0.000000  0.000000  0.000000 1.111111  0.000000  0.000000
0.000000  0.000000  0.000000 0.000000  0.000000  0.000000 1.111111  0.000000  0.000000
...

需要分别将某列的数据取出,以行储存,遇到不同DLTE需要换行,实现代码:

const fs = require("fs");
/*异步读取*==================================*/
const Cnor = [];
fs.readFile("readDLTE.txt", (err, data) => {
  if (err) {
    return console.error(err);
  }
  //按照换行符分割,得到字符串数组myArray,每个元素表示原来文件中的一行
  const myArray = data.toString().split("\n");
  
  myArray.forEach(el => {
       if(el[1]!=='A'){//除去带说明文字的行,只存入数值
        let line = el.split(/\s+/);//去掉所有空格
        Cnor.push(line[12]);//提取需要的字符
        if((Cnor.length+1)%9 === 0) Cnor.push('\n')//添加换行符
       }
  });
  console.log("程序执行完毕。");
  fs.writeFile('Cnor.txt',Cnor.toString(),err=>{
      console.log('Cnor写入成功')
  })
});

注意这里得到的line数组首尾总会有两个“”空字符占位(一行)


明天华为机试,准备一下算法题输入输出写法。

readline函数

readLine()是读取流数据的时候用的,当读到换行标记'\n'、'\r'(回车)时,会跟着换行,同时会以字符串形式返回这一行的数据,当读取完所有的数据时会返回null

数组和字符串互相转化

String.split

split(' '):按一个空格拆分字符串

split(' '):

split(/\s+/): /直接,返回一个数组

Array.join(','/' '/'')

用逗号/空格/直接连接数组,返回一个字符串

rl.on()

rl.on('line',(line)=>{})相当于开启读行的监听,读完一行执行回调。

rl.on('close',()=>{})结束读取的回调。可以在这里处理全局变量

rl.close()

停止读取

示例1 单行输入 单行输出

输入:a,b

2  3

输出:a+b

5
const readline = require('readline');
//实例化
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
//开启事件监听
rl.on('line', function (line) {
//只有一行,以 空格 分隔,存入tokens数组中
    const tokens = line.split(' ');
    console.log(parseInt(tokens[0]) + parseInt(tokens[1]));
});

示例2 多行输入 单行输出

输入:第一行输入一个由字母和数字以及空格组成的字符串,第二行输入一个字符。

ABCabc
A

输出:输入字符串中含有该字符的个数。(不区分大小写字母)

2
const readline = require('readline');

const rl = readline.createInterface({   
    input: process.stdin,   
    output: process.stdout
});

const arr = []; 
rl.on('line', function (line) {
    arr.push(line); 
    if (arr.length === 2) {
        rl.close();
    }
})

rl.on('close', function() {   
    const matches = arr[0].match(new RegExp(arr[1], 'ig'));   
    const len = matches === null ? 0 : matches.length;   
    console.log(len); 
});

示例3 多行输入 多行输出

生成了N个1~500之间的随机整数。请你删去其中重复的数字,即相同的数字只保留一个,把其余相同的数去掉,然后再把这些数从小到大排序,按照排好的顺序输出。

数据范围: 1≤n≤1000  ,输入的数字大小满足 1≤val≤500

输入:第一行先输入随机整数的个数 N 。 接下来的 N 行每行输入一个整数,代表明明生成的随机数。

第一个数字是3,也即这个小样例的N=3,说明用计算机生成了31500之间的随机整数
3
2
2
1

输出:多行,表示输入数据处理后的结果

1
2
const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});
let N = 0;
const myArray = [];//储存数据
rl.on('line', function (line) {
    if (N === 0) {//第一行
        N = parseInt(line); 
    } else{//数据
        myArray.push(parseInt(line));
    }
});
rl.on('close',function (){
  let myArrayWithNoDuplicates = myArray.reduce(function (
    previousValue,
    currentValue
  ) {
    if (previousValue.indexOf(currentValue) === -1) {
      previousValue.push(currentValue);
    }
    return previousValue;
  },[]);
  myArrayWithNoDuplicates.sort((a, b) => a - b);
  for(let i = 0;i < myArrayWithNoDuplicates.length;i++){
      console.log(myArrayWithNoDuplicates[i])
  }
})