Ler arquivos e fazer gravação neles
O aplicativo Tailwind Traders precisa ler os dados de vendas de cada loja, calcular o total e, em seguida, gravar o total de todos os arquivos de vendas individuais da loja em um novo arquivo.
Ler dados de arquivos com fs.readFile
Os arquivos são lidos usando o método readFile
no módulo fs.
await fs.readFile("stores/201/sales.json");
O objeto de retorno do método readFile
é um objeto Buffer
. Isso significa que ele contém o conteúdo do arquivo em formato binário. Por exemplo, assuma que você tem o arquivo chamado sales.json com o conteúdo a seguir.
{
"total": 22385.32
}
Fazer logoff do valor retornado do método readFile
forneceria o valor Buffer
.
<Buffer 7b 0a 20 20 22 74 6f 74 61 6c 22 3a 20 32 32 33 38 35 2e 33 32 0a 7d>
Esse resultado não é útil. Você pode ter lido o arquivo, mas certamente não poderá "ler" esses dados. Mas tudo bem. O JavaScript pode converter um valor Buffer
para um valor de cadeia de caracteres que você pode usar para calcular o total. Para fazer isso, invoque o objeto String
e passe o buffer.
const bufferData = await fs.readFile("stores/201/sales.json");
console.log(String(bufferData));
A saída é:
{
"total": 22385.32
}
Analisar dados com JSON.parse
Esses dados no formato de cadeia de caracteres não são muito bons. Ainda são apenas caracteres, mas agora em um formato que você pode ler. Você deseja transformar essa cadeia de caracteres em dados acessíveis programaticamente (conhecido como análise de dados).
O JavaScript inclui um analisador interno para arquivos JSON. Você não precisa incluir nada para usá-lo. Basta usar o objeto JSON
. Como um bônus, não é necessário converter um Buffer
em uma cadeia de caracteres antes de analisá-lo. O método JSON.parse
pode fazer isso. JSON.parse é um método comum que você usará com frequência no desenvolvimento da Web quando uma API recebe dados (como cadeias de caracteres) pela Internet, que precisam ser transformados em objetos JSON.
// read the file as string
const fileContents = await fs.readFile("stores/201/sales.json");
// turn string into JSON
const data = JSON.parse(fileContents);
// access the value by the property key `total`
console.log(data.total);
A saída é:
22385.32
Dica
Os arquivos são fornecidos em vários formatos. O arquivo mais desejável com o qual trabalhar é o JSON, devido ao suporte interno na linguagem. No entanto, você pode encontrar arquivos .csv, de largura fixa ou em algum outro formato. Nesse caso, é melhor pesquisar um analisador para esse tipo de arquivo em npmjs.org.
Gravar dados em arquivos com fs.writeFile
Você aprendeu a gravar arquivos no exercício anterior. No entanto, você gravou um arquivo vazio. Para gravar dados em um arquivo, use o mesmo método writeFile
, mas passe os dados que você deseja gravar como o terceiro parâmetro.
// read the file as string
const fileContents = await fs.readFile("stores/201/sales.json");
// turn string into JSON
const data = JSON.parse(fileContents);
// file name is totals.txt
const filePath = path.join("salesTotals","totals.txt");
// write the total to the "totals.json" file
await fs.writeFile(filePath, data.total);
O conteúdo do arquivo totals.txt
é:
22385.32
Anexar dados a arquivos com fs.writeFile
No exemplo anterior, o arquivo é substituído sempre que você faz uma gravação nele. Às vezes, você deseja acrescentar dados ao arquivo ao invés de substituir completamente. Você pode acrescentar dados passando um sinalizador para o método writeFile
. Por padrão, o sinalizador é definido como w
, que significa substituir o arquivo. Para acrescentar ao arquivo, passe o sinalizador a
, que significa acrescentar.
// read the file as string
const fileContents = await fs.readFile("stores/201/sales.json");
// turn string into JSON
const data = JSON.parse(fileContents);
// file name is totals.txt
const filePath = path.join("salesTotals","totals.txt");
// write the total to the "totals.json" file
await fs.writeFile(filePath, `${data.total}\r\n`, {flag: "a"});
O conteúdo do arquivo totals.txt
é:
22385.32
Dica
No exemplo de código acima, o \r\n
instrui o JavaScript a colocar o valor na própria linha. Se você não passasse esse valor (conhecido como feed da linha de retorno de carro), você teria todos os números agrupados na mesma linha.
No próximo exercício, você concluirá o projeto de totais de vendas da Tailwind Traders lendo todos os arquivos de vendas e gravando o total geral em um arquivo .txt. Em seguida, o sistema comercial da empresa poderá processar o arquivo.