Невозможно получить доступ к свойству объекта JavaScript из файла CSV

#javascript #json #object #properties

Вопрос:

Мне трудно понять, как получить доступ к свойству моего объекта javascript.

У меня есть приложение Node JS, которое загружает CSV-файл из ВОЗ с данными covid, а затем я просматриваю каждую из этих записей. Вот как я перебираю каждую из записей CSV:

 fs.createReadStream("data.csv")
.pipe(csv())
.on("data", (data) => {
  //process data 
})
.on("end", () => {
});
 

Вот один пример вывода при запуске console.log(data)

 {                                                                         
  'Name': 'Niger',                                                       
  'WHO Region': 'Africa',                                                 
  'Cases - cumulative total': '6203',                                     
  'Cases - cumulative total per 100000 population': '25.63',              
  'Cases - newly reported in last 7 days': '64',                          
  'Cases - newly reported in last 7 days per 100000 population': '0.26',  
  'Cases - newly reported in last 24 hours': '10',                        
  'Deaths - cumulative total': '205',                                     
  'Deaths - cumulative total per 100000 population': '0.85',              
  'Deaths - newly reported in last 7 days': '1',                          
  'Deaths - newly reported in last 7 days per 100000 population': '0',    
  'Deaths - newly reported in last 24 hours': '0'                         
}   
 

Если я запускаю typeof data , я получаю object .

Я хотел бы получить доступ к некоторым свойствам этого объекта. Если я выведу data["WHO Region"] , я получу «Африку». Итак, это работает.


Однако я не могу получить доступ к имени этого объекта.

 console.log(data["Name"]);
console.log(data.hasOwnProperty("Name"));
 

Выводит соответственно undefined и false

Несмотря на то, что свойство name присутствует внутри объекта.


Я также попытался перечислить ключи объекта с помощью Object.keys(data), и вот результат:

  [ 'Name', 'WHO Region', 'Cases - cumulative total', ... ]
 

Итак, очевидно, что имя ключа существует, но я по какой-то причине не могу получить к нему доступ.
Я что-то там упускаю?

Комментарии:

1. У вас есть пример файла CSV? Просто для пояснения.

2. @koloml Это файл CSV с этой страницы covid19.who.int/table Вот ссылка для скачивания: covid19.who.int/WHO-COVID-19-global-table-data.csv

3. Проверьте ответ. Этот файл имеет один символ в начале содержимого.

Ответ №1:

Проблема вызвана меткой порядка байтов (BOM) в начале файла, представленной последовательностью байтов 0xEF,0xBB,0xBF , соответствующей кодовой точке UTF-8 U FEFF.

введите описание изображения здесь

Простым обходным путем для вашего кода было бы заменить это следующим образом:

 const results = [];

fs.createReadStream('data.csv')
.pipe(csv())
.on('data', (data) => {
    // Replace BOM in key
    const key1 = Object.keys(data)[0];
    data = { ...data, [key1.replace(/uFEFF/, '')]: data[key1] };
    results.push(data);
})
.on('end', () => {
    results.forEach(result => { 
        console.log(`Name: ${result["Name"]}`);
    })
});
 

или

Вы можете открыть файл в Nodepad и с помощью Encoding меню изменить его с UTF-8-BOM на UTF-8 и сохранить.

Ответ №2:

У вас есть невидимый символ в Name свойстве объекта. Вы можете увидеть это, если вы прошли результат console.log в консоли браузера:

Вывод из Chrome DevTools

Проверьте исходный файл CSV и найдите этот невидимый символ.

РЕДАКТИРОВАТЬ: этот символ — ZWNBSP (пробел без разрыва нулевой ширины) в начале файла.

Символ ZWNBSP, видимый в IDE

Комментарии:

1. Спасибо за вашу помощь! Я не знал об этом символе