2013-12-16 1 views
3

노드 모듈 json2csv을 사용하여 JSON 객체를 CSV 파일로 구문 분석하는 방법을 배우고 있습니다. 이전에는 JSON을 사용해 본 적이 없으므로이 모든 것이 나에게 새로운 것입니다.json2csv nodejs 모듈을 사용하여 JSON 객체를 CSV 파일로 구문 분석하는 방법

내 JSON 객체는 다음과 같이 포맷 :

{ 
"car": 
     { 
      "name":["Audi"], 
      "price":["40000"], 
      "color":["blue"] 
     } 
} 

그리고 출력 CSV 파일은 다음과 같은 포맷 :

"car","name","price","color" 
{"name":["Audi"],"price":["40000"],"color":["blue"]},,, 

을 어떻게 같이 할 수있는 CSV 출력을 얻을 수있을 것입니다 대신에?

name, price, color 
"Audi",40000,"blue" 

일반 JSON 데이터의 경우 필드를 직접 호출 할 수 있다고 생각하지만 JSON 개체에서 어떻게 작동하는지 이해하지 못합니다.

답변

3

json2csv 필드 만 직접있는 평평한 구조를 지원할 수 있어야 json 뿌리의 아이들. 당신이 그것을 변경하려면

는 코드를 복제 고려하고 다음과 같이 수행

// createColumnContent function changed from original code 
var createColumnContent = function(params, str, callback) { 
    params.data.forEach(function(data_element) { 
    //if null or empty object do nothing 
    if (data_element && Object.getOwnPropertyNames(data_element).length > 0) { 
     var line = ''; 
     var eol = os.EOL || '\n'; 
     params.fields.forEach(function(field_element) { 
     // here, instead of direct child, getByPath support multiple subnodes levels 
     line += getByPath(data_element, field_element.split('.'), 0) + params.del; 
     }); 
     //remove last delimeter 
     line = line.substring(0, line.length - 1); 
     line = line.replace(/\\"/g, '""'); 
     str += eol + line; 
    } 
    }); 
    callback(str); 
}; 

var getByPath = function(data_element, path, position) { 
    if (data_element.hasOwnProperty(path[position])) { 
    if (position === path.length - 1) { 
     return JSON.stringify(data_element[path[position]]); 
    } 
    else { 
     return getByPath(data_element[path[position]], path, position + 1) 
    } 
    } 
    else { 
    return ''; 
    } 
} 

사용 :

json2csv({data: json, fields: ['car.name.0', 'car.price.0', 'car.color.0']}, function(err, csv) { 
    if (err) console.log(err); 
    fs.writeFile('file.csv', csv, function(err) { 
    if (err) throw err; 
    console.log('file saved'); 
    }); 
}); 

출력 파일 내용 :

"car.name.0","car.price.0","car.color.0" 
"Audi","40000","blue" 

등을 복제하고 내 자신의 버전으로 작업하기위한 보조 노트 :

git clone https://github.com/zeMirco/json2csv.git 

변경을 추가 ...

이 변경된 버전을 사용하려면 :

npm install /local/path/to/repo 
2

입력, 그것은 json2csv document 나쁜 형태를 좋아한다되어

var json2csv = require('json2csv'); 

var json = [ 
    { 
    "car": "Audi", 
    "price": 40000, 
    "color": "blue" 
    }, { 
    "car": "BMW", 
    "price": 35000, 
    "color": "black" 
    }, { 
    "car": "Porsche", 
    "price": 60000, 
    "color": "green" 
    } 
]; 

json2csv({data: json, fields: ['car', 'price', 'color']}, function(err, csv) { 
    if (err) console.log(err); 
    fs.writeFile('file.csv', csv, function(err) { 
    if (err) throw err; 
    console.log('file saved'); 
    }); 
}); 

은 "file.csv"의 내용

car,  price, color 
"Audi", 40000, "blue" 
"BMW",  35000, "black" 
"Porsche", 60000, "green" 
+0

안녕, 회신 주셔서 감사합니다! 입력이 잘못된 형식 인 이유를 알려 주실 수 있습니까? 궁극적으로 내가하고있는 일은 먼저 XML에서 JSON으로 변환 한 다음 JSON에서 CSV로 변환하는 것입니다. JSON 입출력에 대한 XML은 원래 형식과 비슷합니다. – imthinhvu

-1

체크 아웃 Underscore.js pluck method - 당신이 _.pluck(json, 'car')을 전달하는 경우의 data 대신 원래 json의를 json2csv하기 위해, 당신은 당신이있어 무엇을 얻어야한다 찾고.

1

JSON 객체의 하위 배열을 사용하려면 json2csv의 데이터 섹션에있는 JSON 객체 뒤에 .<name>으로 주소를 지정하여 JSON 객체 내의 하위 배열을 사용하도록 지시 할 수 있습니다. 귀하의 경우에는

,이 같은 것을 볼 수 있습니다

const json2csv = require('json2csv'); 
 
const fs = require('fs'); 
 

 
var json = { 
 
"car":[ 
 
    { 
 
    "name":"Audi", 
 
    "price":"40000", 
 
    "color":"blue" 
 
    } 
 
] 
 
}; 
 

 
json2csv({data: json.car, fields: ['name', 'price', 'color']}, function(err, csv) { 
 
    if (err) console.log(err); 
 
    fs.writeFile('cars.csv', csv, function(err) { 
 
    if (err) throw err; 
 
    console.log('cars file saved'); 
 
    }); 
 
});

관련 문제