Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果字符串不';文本文件中不存在_Javascript_Node.js - Fatal编程技术网

Javascript 如果字符串不';文本文件中不存在

Javascript 如果字符串不';文本文件中不存在,javascript,node.js,Javascript,Node.js,如果文本文件中的行不存在,请寻找添加到文本文件的最佳方式的建议 例如,file.txt如下所示: Aimee Kestenberg ALLSAINTS 14th & Union 3.1 PHILLIP LIM Champion Botkier CHRISTIAN LAURIER Christopher Kon Co-Lab Day & Mood 例如,如果var x=“Aimee Kestenberg” 如果x不存在,则需要将x添加到file.txt 文本文件不会太大,随着它的

如果文本文件中的行不存在,请寻找添加到文本文件的最佳方式的建议

例如,file.txt如下所示:

Aimee Kestenberg
ALLSAINTS
14th & Union
3.1 PHILLIP LIM
Champion
Botkier
CHRISTIAN LAURIER
Christopher Kon
Co-Lab
Day & Mood
例如,如果var x=“Aimee Kestenberg”
如果x不存在,则需要将x添加到file.txt

文本文件不会太大,随着它的增长,最多大约100-200行。
是否需要将文本文件读入数组并在新行上拆分?
然后循环遍历数组并检查它是否等于x?
如果x不在数组中,则为fs.appendFile

目前我正在使用fs.appendFile将所有x添加到文本文件中。
但目标是仅在文本文件中不存在x时添加x

fs.appendFile('file.txt', '\n' + x, (err) => {
   if (err) throw err;
});

任何人都可以帮助阅读文本文件并在其中循环的代码是什么样子的吗?或者有更好的方法来实现这一点吗?内置函数?

您关于迭代行的想法很好。您还可以跳过拆分和迭代,并检查整个文件:

const inputData = fs.readfileSync('file.txt').toString()

itemsToAppend.forEach((item) => {
  const line = `${item}\n`
  if (!inputData.includes(line)) {
    fs.appendFile('file.txt', line, (err) => {
      if (err) throw err
    })
  }
})
您还可以获得唯一的行,然后重新写入整个文件(为了简洁起见,我在这里使用
sync
方法,但异步版本也可以):


你关于迭代行的想法很好。您还可以跳过拆分和迭代,并检查整个文件:

const inputData = fs.readfileSync('file.txt').toString()

itemsToAppend.forEach((item) => {
  const line = `${item}\n`
  if (!inputData.includes(line)) {
    fs.appendFile('file.txt', line, (err) => {
      if (err) throw err
    })
  }
})
您还可以获得唯一的行,然后重新写入整个文件(为了简洁起见,我在这里使用
sync
方法,但异步版本也可以):


此方法返回一个
承诺
,该承诺将告诉文件是否包含给定行。请注意,它区分大小写

import { readFile } from "fs/promises";

const containsLine = (path, line) =>
  new Promise(async (resolve) => {
    const data = await readFile(path);
    const lines = data.toString().split(/\r?\n/);
    resolve(lines.includes(line));
});
然后,您可以像这样包装自己的代码,使其具有通用异步函数:

import { appendFile } from "fs/promises";

async function appendLineIfLacking(path, line) {
  if (await containsLine(path, line))
    await appendFile(path, "\n" + line );
}

此方法返回一个
承诺
,该承诺将告诉文件是否包含给定行。请注意,它区分大小写

import { readFile } from "fs/promises";

const containsLine = (path, line) =>
  new Promise(async (resolve) => {
    const data = await readFile(path);
    const lines = data.toString().split(/\r?\n/);
    resolve(lines.includes(line));
});
然后,您可以像这样包装自己的代码,使其具有通用异步函数:

import { appendFile } from "fs/promises";

async function appendLineIfLacking(path, line) {
  if (await containsLine(path, line))
    await appendFile(path, "\n" + line );
}

为什么不直接按原样搜索文本(使用regex将
\n
考虑在内),而不是为了检查行是否存在而进行拆分和搜索呢?如果我理解正确,这意味着您必须为
输入构造一个正则表达式,后跟
(\r?\n)|$)
以说明具有不同换行符或文件结尾的不同操作系统。因为
将被插入到正则表达式中,所以也需要对其进行转义。也就是说,上面的方法使用了拆分函数,然后是线性搜索,因为它完美地记录了它的功能,所以读起来也很好。很明显,出于某种原因,我没有想到逃逸的必要性。。你说得对。我的建议很容易出错如果你想使用Promissions和async/await,而不是手动用Promission包装,你可以
从'fs'
导入{Promissions as fs},然后使用
const{readFile,appendFile}=fs
。谢谢你的建议!我已经相应地更新了代码段。为什么不按原样搜索文本(使用regex考虑
\n
),而不是只为了检查行是否存在而进行拆分和搜索呢?如果我理解正确,这意味着您必须为
输入构建一个正则表达式,后跟
(\r?\n)|$)
以说明具有不同换行符或文件结尾的不同操作系统。因为
将被插入到正则表达式中,所以也需要对其进行转义。也就是说,上面的方法使用了拆分函数,然后是线性搜索,因为它完美地记录了它的功能,所以读起来也很好。很明显,出于某种原因,我没有想到逃逸的必要性。。你说得对。我的建议很容易出错如果你想使用Promissions和async/await,而不是手动用Promission包装,你可以
从'fs'
导入{Promissions as fs},然后使用
const{readFile,appendFile}=fs
。谢谢你的建议!我已经相应地更新了代码片段。