파일 읽기 및 쓰기

완료됨

Tailwind Traders 애플리케이션은 각 저장소의 판매 데이터를 읽은 다음 합계를 계산한 다음, 모든 개별 저장소 판매 파일의 합계를 새 파일에 기록해야 합니다.

fs.readFile을 사용하여 파일에서 데이터 읽기

fs 모듈의 readFile 메서드를 통해 파일을 읽습니다.

await fs.readFile("stores/201/sales.json");

readFile 메서드의 반환 개체는 Buffer 개체입니다. 이진 형식의 파일 내용이 포함됩니다. 예를 들어 다음 내용이 포함된 sales.json이라는 파일이 있다고 가정하겠습니다.

{
  "total": 22385.32
}

readFile 메서드의 반환 값을 기록하면 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>

이 결과는 유용하지 않습니다. 파일을 읽었을 수도 있지만 확실히, 이 데이터는 “읽을” 수 없습니다. 그래도 괜찮습니다. JavaScript는 합계를 Buffer 계산하는 데 사용할 수 있는 문자열 값으로 값을 변환할 수 있습니다. String 개체를 호출하고 버퍼를 전달하면 됩니다.

const bufferData = await fs.readFile("stores/201/sales.json");
console.log(String(bufferData));

출력은 다음과 같습니다.

{
  "total": 22385.32
}

JSON.parse를 사용하여 데이터 구문 분석

문자열 형식의 이 데이터는 별로 유용하지 않습니다. 여전히 문자일 뿐이지만 이제 읽을 수 있는 형식입니다. 이 문자열을 프로그래밍 방식으로 액세스할 수 있는 데이터(구문 분석 데이터라고 함)로 변환하는 기능을 원합니다.

JavaScript에는 JSON 파일에 대한 기본 제공 파서가 포함되어 있습니다. 아무것도 포함하지 않아도 파서를 사용할 수 있습니다. JSON 개체만 사용하면 됩니다. 뿐만 아니라 구문 분석하기 전에 Buffer 값을 문자열로 변환할 필요도 없습니다. JSON.parse 메서드가 이 작업을 수행할 수 있습니다. JSON.parse 는 API가 인터넷을 통해 데이터를 문자열로 수신한 다음 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);

출력은 다음과 같습니다.

22385.32

다양한 형식의 파일이 있습니다. JSON 파일은 언어의 기본 제공 지원 때문에 가장 바람직한 작업 파일 형식입니다. 그러나 .csv 파일, 고정 너비 파일 또는 다른 형식의 파일을 발견할 수도 있습니다. 이 경우 npmjs.org에서 해당 파일 형식의 파서를 검색하는 것이 가장 좋습니다.

fs.writeFile을 사용하여 파일에 데이터 쓰기

이전 연습에서 파일을 작성하는 방법을 배웠습니다. 빈 파일을 작성한 것뿐입니다. 파일에 데이터를 쓰려면 동일한 writeFile 메서드를 사용하되, 쓰려는 데이터를 세 번째 매개 변수로 전달하면 됩니다.

// 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);

파일의 totals.txt 내용은 다음과 같습니다.

22385.32

fs.writeFile을 사용하여 파일에 데이터 추가

앞의 예제에서는 파일에 쓸 때마다 파일을 덮어씁니다. 데이터를 완전히 바꾸는 대신 파일에 추가하려는 경우가 있습니다. writeFile 메서드에 플래그를 전달하면 데이터를 추가할 수 있습니다. 기본적으로 플래그는 파일 바꾸기를 의미하는 플래그w로 설정됩니다. 대신 파일에 추가하려면 플래그를 a 전달합니다. 즉, 추가를 의미합니다.

// 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"});

파일의 totals.txt 내용은 다음과 같습니다.

22385.32

이전 코드 예제에서 \r\n은 값을 새 줄에 입력하도록 JavaScript에 지시합니다. 이 값(‘캐리지 리턴 줄 바꿈’이라고 함)을 전달하지 않으면 모든 숫자가 한 줄에 입력됩니다.

다음 연습에서는 모든 매출 파일을 읽고 .txt 파일에 총합계를 써서 Tailwind Traders의 매출 합계 프로젝트를 완료합니다. 그러면 회사의 상거래 시스템에서 파일을 처리할 수 있습니다.