Csv (क्लाइंट की ओर) को जावास्क्रिप्ट सरणी जानकारी कैसे निर्यात करें?


511

मुझे पता है कि इस प्रकृति के बहुत सारे प्रश्न हैं, लेकिन मुझे जावास्क्रिप्ट का उपयोग करने की आवश्यकता है। मैं उपयोग कर रहा हूँ Dojo 1.8और सरणी में सभी विशेषता जानकारी है, जो इस तरह दिखता है:

[["name1", "city_name1", ...]["name2", "city_name2", ...]]

किसी भी विचार मैं कैसे CSVग्राहक की ओर से इस निर्यात कर सकते हैं ?

जवाबों:


837

आप इसे देशी जावास्क्रिप्ट में कर सकते हैं। आपको अपना डेटा सही CSV प्रारूप में पार्स करना होगा (ऐसा मानकर कि आप अपने डेटा के लिए सरणियों का उपयोग कर रहे हैं जैसा कि आपने प्रश्न में वर्णित किया है):

const rows = [
    ["name1", "city1", "some other info"],
    ["name2", "city2", "more info"]
];

let csvContent = "data:text/csv;charset=utf-8,";

rows.forEach(function(rowArray) {
    let row = rowArray.join(",");
    csvContent += row + "\r\n";
});

या छोटा तरीका ( तीर के कार्यों का उपयोग करके ):

const rows = [
    ["name1", "city1", "some other info"],
    ["name2", "city2", "more info"]
];

let csvContent = "data:text/csv;charset=utf-8," 
    + rows.map(e => e.join(",")).join("\n");

फिर आप CSV फ़ाइल को डाउनलोड करने के लिए जावास्क्रिप्ट window.openऔर encodeURIकार्यों का उपयोग कर सकते हैं :

var encodedUri = encodeURI(csvContent);
window.open(encodedUri);

संपादित करें:

यदि आप अपनी फ़ाइल को एक विशिष्ट नाम देना चाहते हैं, तो आपको कुछ अलग तरीके से काम करना होगा क्योंकि यह window.openविधि का उपयोग करके डेटा यूआरआई तक पहुंचने का समर्थन नहीं करता है। इसे प्राप्त करने के लिए, आप एक छिपा हुआ <a>डोम नोड बना सकते हैं और इसकी downloadविशेषता निम्नानुसार निर्धारित कर सकते हैं :

var encodedUri = encodeURI(csvContent);
var link = document.createElement("a");
link.setAttribute("href", encodedUri);
link.setAttribute("download", "my_data.csv");
document.body.appendChild(link); // Required for FF

link.click(); // This will download the data file named "my_data.csv".

4
मैं जो जानता हूं, उसका उपयोग करने का कोई तरीका नहीं है window.open। हालाँकि, आप एक छिपी हुई लिंक बना सकते हैं जिसमें एक downloadविशेषता है जिसे फ़ाइल नाम आप चाहते हैं। फिर "क्लिक" यह लिंक आपकी इच्छा के नाम पर फ़ाइल डाउनलोड करेगा, मैं इसे अपने उत्तर में जोड़ूंगा।
डिफॉल्ट

14
मुझे document.body.appendChild(link);एफएफ में पूरा समर्थन पाने के लिए जोड़ना था ।
हार्डबाइट

9
यह उत्तर गलत है: यह मामले के लिए विफल होगा data = [["Hello, world"]]। यह दो कॉलम आउटपुट करेगा जब इसे एक आउटपुट करना चाहिए।
एरेड्रिडेल

18
यह ~ 7000 पंक्तियों की तरह ठीक काम करता है। लेकिन यह त्रुटि देना शुरू करता है: NETWORK_INVALID_REQUEST । क्या कोई अन्य संस्था भी इस मुद्दे का सामना कर रही है? encodeURIComponent()फ़ंक्शन या कुछ पर डेटा की कोई ऊपरी सीमा है? मैं क्रोम का उपयोग ब्राउज़र के रूप में कर रहा हूँ।
अभिमान

13
@ अभिमुख उत्तर आपको किसी चीज़ के लिए एक ब्लॉब प्रकार का उपयोग करना होगा जो कि बड़े पैमाने पर काम करेगा, यह ठीक काम करेगा, जैसे: blob = new Blob ([csvContent], {type: "text / csv"}); href = window.URL.createObjectURL (बूँद); अधिक जानकारी: stackoverflow.com/a/19328891/1854079
mdubez

256

ऊपर दिए गए उत्तरों के आधार पर मैंने यह फ़ंक्शन बनाया है जिसे मैंने IE 11, क्रोम 36 और फ़ायरफ़ॉक्स 29 पर परीक्षण किया है

function exportToCsv(filename, rows) {
    var processRow = function (row) {
        var finalVal = '';
        for (var j = 0; j < row.length; j++) {
            var innerValue = row[j] === null ? '' : row[j].toString();
            if (row[j] instanceof Date) {
                innerValue = row[j].toLocaleString();
            };
            var result = innerValue.replace(/"/g, '""');
            if (result.search(/("|,|\n)/g) >= 0)
                result = '"' + result + '"';
            if (j > 0)
                finalVal += ',';
            finalVal += result;
        }
        return finalVal + '\n';
    };

    var csvFile = '';
    for (var i = 0; i < rows.length; i++) {
        csvFile += processRow(rows[i]);
    }

    var blob = new Blob([csvFile], { type: 'text/csv;charset=utf-8;' });
    if (navigator.msSaveBlob) { // IE 10+
        navigator.msSaveBlob(blob, filename);
    } else {
        var link = document.createElement("a");
        if (link.download !== undefined) { // feature detection
            // Browsers that support HTML5 download attribute
            var url = URL.createObjectURL(blob);
            link.setAttribute("href", url);
            link.setAttribute("download", filename);
            link.style.visibility = 'hidden';
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
        }
    }
}

उदाहरण के लिए: https://jsfiddle.net/jossef/m3rrLzk0/


6
गिर वापसी कर सके करने के लिए window.openएक में elseकी link.download !== undefined
MrYellow

2
यह कोड का एक अच्छा टुकड़ा है। कोई भी मौका जिसे आप CC-BY-SA के SO डिफ़ॉल्ट से अधिक उदार के तहत लाइसेंस देने के लिए तैयार हैं? उदाहरण के लिए, CC0, MIT, BSD, Apache, X11। । । meta.stackexchange.com/questions/12527/…
joseph_morris

1
मैं काफी कुछ वेब अनुप्रयोगों में एक्सेल निर्यात को लागू करने के लिए इस पद्धति का उपयोग कर रहा हूं। लेकिन Chrome 43+ ने अब DOM विशेषताओं को प्रोटोटाइप श्रृंखला में स्थानांतरित कर दिया है। एक अपवाद पर फेंक दिया जाता है link.style.visibility='hidden'। B / c DOM विशेषता को आसानी से पढ़ता है। अधिक जानकारी अपडेट में पा सकते हैं। html5rocks.com/2015/04/… "खंड में केवल पढ़ने के लिए केवल सख्त मोड में गुण लिखने से त्रुटि हो जाएगी"
Blaise

1
यह प्रतिक्रिया अब तक की सबसे अच्छी है। इसमें विशेष वर्ण और कोष्ठक के मामले शामिल हैं।
व्लादिमीर कोस्तोव

2
मैंने इस उत्तर के डाउनलोड अनुभाग का उपयोग किया, और इसने क्रोम पर अच्छा काम किया, धन्यवाद!
लीरन एच।

77

यह समाधान इंटरनेट एक्सप्लोरर 10+, एज, क्रोम और फायरफॉक्स, सफारी, ++ के पुराने और नए संस्करणों के साथ काम करना चाहिए

स्वीकृत उत्तर IE और सफारी के साथ काम नहीं करेगा।

// Example data given in question text
var data = [
  ['name1', 'city1', 'some other info'],
  ['name2', 'city2', 'more info']
];

// Building the CSV from the Data two-dimensional array
// Each column is separated by ";" and new line "\n" for next row
var csvContent = '';
data.forEach(function(infoArray, index) {
  dataString = infoArray.join(';');
  csvContent += index < data.length ? dataString + '\n' : dataString;
});

// The download function takes a CSV string, the filename and mimeType as parameters
// Scroll/look down at the bottom of this snippet to see how download is called
var download = function(content, fileName, mimeType) {
  var a = document.createElement('a');
  mimeType = mimeType || 'application/octet-stream';

  if (navigator.msSaveBlob) { // IE10
    navigator.msSaveBlob(new Blob([content], {
      type: mimeType
    }), fileName);
  } else if (URL && 'download' in a) { //html5 A[download]
    a.href = URL.createObjectURL(new Blob([content], {
      type: mimeType
    }));
    a.setAttribute('download', fileName);
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
  } else {
    location.href = 'data:application/octet-stream,' + encodeURIComponent(content); // only this mime type is supported
  }
}

download(csvContent, 'dowload.csv', 'text/csv;encoding:utf-8');

कोड स्निपेट चलाने से मॉक डेटा को सीएसवी के रूप में डाउनलोड किया जाएगा

क्रेडिट्स को डांडविस https://stackoverflow.com/a/16377813/1350598


1
(बहुत कम से कम, HTML5 कोड) के बिना काम करता है setTimeout
स्टबबोर्नशूगुय

@StubbornShowaGuy शांत तो मैं उदाहरण कोड से setTimeout हटा दूँगा :)
Arne H. Bitubekk

नवीनतम क्रोम, IE और फ़ायरफ़ॉक्स में काम करता है। धन्यवाद!
दीवा

केवल सही मायने में पार ब्राउज़र समाधान यहाँ। नोट यह सफारी 10.10 और मोबाइल सफारी पर काम करता है। हालाँकि, iframeअनुभाग को केवल स्थान से बदला जा सकता है
Dan

2
नोट: फ़ंक्शन में एक टाइपो है, यह वास्तव में है URL.createObjectURL( URLनहीं के साथ समाप्त होता है Url)।
नाथन हेंचि

35

मैं थोड़ा अधिक RFC 4180 अनुपालन की तलाश में यहां आया था और मैं एक कार्यान्वयन खोजने में विफल रहा, इसलिए मैंने अपनी आवश्यकताओं के लिए एक (संभवतः अक्षम) एक बना दिया। मुझे लगा कि मैं इसे सभी के साथ साझा करूंगा।

var content = [['1st title', '2nd title', '3rd title', 'another title'], ['a a a', 'bb\nb', 'cc,c', 'dd"d'], ['www', 'xxx', 'yyy', 'zzz']];

var finalVal = '';

for (var i = 0; i < content.length; i++) {
    var value = content[i];

    for (var j = 0; j < value.length; j++) {
        var innerValue =  value[j]===null?'':value[j].toString();
        var result = innerValue.replace(/"/g, '""');
        if (result.search(/("|,|\n)/g) >= 0)
            result = '"' + result + '"';
        if (j > 0)
            finalVal += ',';
        finalVal += result;
    }

    finalVal += '\n';
}

console.log(finalVal);

var download = document.getElementById('download');
download.setAttribute('href', 'data:text/csv;charset=utf-8,' + encodeURIComponent(finalVal));
download.setAttribute('download', 'test.csv');

उम्मीद है कि यह भविष्य में किसी की मदद करेगा। यह फ़ाइल डाउनलोड करने की क्षमता के साथ CSV के दोनों एन्कोडिंग को जोड़ती है। Jsfiddle पर मेरे उदाहरण में । आप फ़ाइल (HTML 5 ब्राउज़र मानकर) डाउनलोड कर सकते हैं या कंसोल में आउटपुट देख सकते हैं।

अपडेट करें:

Chrome अब फ़ाइल का नाम देने की क्षमता खो चुका है। मुझे यकीन नहीं है कि क्या हुआ है या इसे कैसे ठीक किया जाए, लेकिन जब भी मैं इस कोड (jsfiddle सहित) का उपयोग करता हूं, तो डाउनलोड की गई फ़ाइल अब नाम है download.csv


अच्छा कैच क्रिस, मैंने इसे संख्यात्मक डेटा के साथ परीक्षण नहीं किया :)
Uxonith

मुझे नहीं पता कि आखिरी अशक्त जांच अपेक्षित व्यवहार है या नहीं। रिक्त एक स्ट्रिंग से बहुत अलग है। यदि कोई इसे लागू करना चाहता था, तो मैं एक कस्टम अशक्त मूल्य (उदाहरण: '[[NULL]]') की सिफारिश करूंगा। अपरिभाषित के लिए एक अपवाद के रूप में अच्छी तरह से वांछित हो सकता है, लेकिन मैं एक खाली स्ट्रिंग के साथ अशक्त की जगह नहीं की सिफारिश करेंगे।
उकॉनिथ

मैंने परीक्षण किया है और पाया है कि आप सही हैं। यह क्रोम और ओपेरा में काम करने लगता है। सफारी केवल सामग्री के साथ एक पृष्ठ खोलता है। इंटरनेट एक्सप्लोरर ... अच्छी तरह से यह IE है। मेरी स्थिति के लिए, मैं अपना CSV सर्वर साइड जनरेट करने जा रहा हूं और इसे इस तरह से, दुख की बात है।
उक्सोनिथ

33

@Default से समाधान क्रोम पर सही काम करता है (इसके लिए बहुत बहुत धन्यवाद!), लेकिन मुझे आईई के साथ एक समस्या थी।

यहाँ एक समाधान है (IE10 पर काम करता है):

var csvContent=data; //here we load our csv data 
var blob = new Blob([csvContent],{
    type: "text/csv;charset=utf-8;"
});

navigator.msSaveBlob(blob, "filename.csv")

23

Chrome 35 अपडेट में, डाउनलोड विशेषता व्यवहार बदल दिया गया था।

https://code.google.com/p/chromium/issues/detail?id=373182

क्रोम में काम करने के लिए, इसका उपयोग करें

var pom = document.createElement('a');
var csvContent=csv; //here we load our csv data 
var blob = new Blob([csvContent],{type: 'text/csv;charset=utf-8;'});
var url = URL.createObjectURL(blob);
pom.href = url;
pom.setAttribute('download', 'foo.csv');
pom.click();

1
आप इसे भी देख सकते हैं: github.com/mholt/PapaParse/issues/175#issuecomment-201308792
Gabriel

यह इस समय सही उत्तर है, जैसा कि स्वीकार नहीं किया गया है!
म्याऊ

17

सभी भाषाओं के लिए काम करना

        function convertToCsv(fName, rows) {
        var csv = '';
        for (var i = 0; i < rows.length; i++) {
            var row = rows[i];
            for (var j = 0; j < row.length; j++) {
                var val = row[j] === null ? '' : row[j].toString();
                val = val.replace(/\t/gi, " ");
                if (j > 0)
                    csv += '\t';
                csv += val;
            }
            csv += '\n';
        }

        // for UTF-16
        var cCode, bArr = [];
        bArr.push(255, 254);
        for (var i = 0; i < csv.length; ++i) {
            cCode = csv.charCodeAt(i);
            bArr.push(cCode & 0xff);
            bArr.push(cCode / 256 >>> 0);
        }

        var blob = new Blob([new Uint8Array(bArr)], { type: 'text/csv;charset=UTF-16LE;' });
        if (navigator.msSaveBlob) {
            navigator.msSaveBlob(blob, fName);
        } else {
            var link = document.createElement("a");
            if (link.download !== undefined) {
                var url = window.URL.createObjectURL(blob);
                link.setAttribute("href", url);
                link.setAttribute("download", fName);
                link.style.visibility = 'hidden';
                document.body.appendChild(link);
                link.click();
                document.body.removeChild(link);
                window.URL.revokeObjectURL(url);
            }
        }
    }



    convertToCsv('download.csv', [
        ['Order', 'Language'],
        ['1', 'English'],
        ['2', 'Español'],
        ['3', 'Français'],
        ['4', 'Português'],
        ['5', 'čeština'],
        ['6', 'Slovenščina'],
        ['7', 'Tiếng Việt'],
        ['8', 'Türkçe'],
        ['9', 'Norsk bokmål'],
        ['10', 'Ελληνικά'],
        ['11', 'беларускі'],
        ['12', 'русский'],
        ['13', 'Українська'],
        ['14', 'հայերեն'],
        ['15', 'עִברִית'],
        ['16', 'اردو'],
        ['17', 'नेपाली'],
        ['18', 'हिंदी'],
        ['19', 'ไทย'],
        ['20', 'ქართული'],
        ['21', '中国'],
        ['22', '한국어'],
        ['23', '日本語'],
    ])

प्रभावशाली! (+1)। StackOverflow में आपका स्वागत है, दोस्त!
रैन लाइफशिट

क्या आप मुझे यह समझने में मदद कर सकते हैं कि UTF-16 कोड ब्लॉक क्या है और यहाँ के लिए क्या उपयोग किया जाता है?
Mar1009

हाय मार 1009। कुछ भाषाओं के लिए यह आवश्यक है। उदाहरण के लिए, सिरिलिक वर्णमाला।
सेरदार दीदन

13

तुम वहाँ जाओ :

<!doctype html>  
<html>  
<head></head>  
<body>
<a href='#' onclick='downloadCSV({ filename: "stock-data.csv" });'>Download CSV</a>

<script type="text/javascript">  
    var stockData = [
        {
            Symbol: "AAPL",
            Company: "Apple Inc.",
            Price: "132.54"
        },
        {
            Symbol: "INTC",
            Company: "Intel Corporation",
            Price: "33.45"
        },
        {
            Symbol: "GOOG",
            Company: "Google Inc",
            Price: "554.52"
        },
    ];

    function convertArrayOfObjectsToCSV(args) {
        var result, ctr, keys, columnDelimiter, lineDelimiter, data;

        data = args.data || null;
        if (data == null || !data.length) {
            return null;
        }

        columnDelimiter = args.columnDelimiter || ',';
        lineDelimiter = args.lineDelimiter || '\n';

        keys = Object.keys(data[0]);

        result = '';
        result += keys.join(columnDelimiter);
        result += lineDelimiter;

        data.forEach(function(item) {
            ctr = 0;
            keys.forEach(function(key) {
                if (ctr > 0) result += columnDelimiter;

                result += item[key];
                ctr++;
            });
            result += lineDelimiter;
        });

        return result;
    }

    window.downloadCSV = function(args) {
        var data, filename, link;

        var csv = convertArrayOfObjectsToCSV({
            data: stockData
        });
        if (csv == null) return;

        filename = args.filename || 'export.csv';

        if (!csv.match(/^data:text\/csv/i)) {
            csv = 'data:text/csv;charset=utf-8,' + csv;
        }
        data = encodeURI(csv);

        link = document.createElement('a');
        link.setAttribute('href', data);
        link.setAttribute('download', filename);
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
       }
</script>  
</body>  
</html>  

1
बहुत बढ़िया जवाब। मैं इसे एक के रूप में स्वीकार कर रहा हूँ किसी कारण के लिए स्वीकार किए जाते हैं उत्तर सब कुछ एक ही स्तंभ में डालता है। यह सभी को अलग-अलग स्तंभों में तोड़ता है और JSON जैसे डेटा प्रारूप का समर्थन अविश्वसनीय रूप से उपयोगी है।
होसर डेस

यह तब काम करता है जब लिंक को पहले दस्तावेज़ बॉडी में जोड़ा जाता है और फिर क्लिक कहा जाता है। और फिर इसे डोम से हटा दिया जाता है।
जय डब्बल

1
अच्छा जवाब, केवल दोष यह है कि यह ठीक से काम नहीं करता है जब डेटा में एक स्तंभ सीमांकित होता है "," अर्थात पता: '10 अनंत लूप लेन, कक्ष 56 ', लेन के बाद अल्पविराम पर ध्यान दें। मेरा सुझाव है कि आप डेटा को CSV में बदलने के लिए PapaParse लिंक का उपयोग करें, फिर वास्तविक फ़ाइल डाउनलोड के लिए उपरोक्त डाउनलोडसीवी विधि का उपयोग करें
फिल

यह मेरे लिए एकदम सही काम करता है। बस एक समस्या है, मेरे पास '000002342' की तरह कुछ संख्याएँ हैं, लेकिन जब सीएसवी को निर्यात किया जाता है, तो प्रमुख शून्य हटा दिए जाते हैं। क्या इसे रोकने का कोई तरीका है?
आकांक्षा धवन

13

फोल्क्स अपने स्वयं के सीएसवी स्ट्रिंग बनाने की कोशिश कर रहे हैं, जो किनारे के मामलों में विफल होते हैं, जैसे विशेष वर्ण और ऐसे, निश्चित रूप से यह एक हल समस्या है?

पापपर्से - JSON से CSV एन्कोडिंग के लिए उपयोग करें। Papa.unparse()

import Papa from "papaparse";

const downloadCSV = (args) => {  

  let filename = args.filename || 'export.csv';
  let columns = args.columns || null;

  let csv = Papa.unparse({ data: args.data, fields: columns})
  if (csv == null) return;

  var blob = new Blob([csv]);
  if (window.navigator.msSaveOrOpenBlob)  // IE hack; see http://msdn.microsoft.com/en-us/library/ie/hh779016.aspx
      window.navigator.msSaveBlob(blob, args.filename);
  else
  {
      var a = window.document.createElement("a");
      a.href = window.URL.createObjectURL(blob, {type: "text/plain"});
      a.download = filename;
      document.body.appendChild(a);
      a.click();  // IE: "Access is denied"; see: https://connect.microsoft.com/IE/feedback/details/797361/ie-10-treats-blob-url-as-cross-origin-and-denies-access
      document.body.removeChild(a);
  }

}

उदाहरण उपयोग

downloadCSV({ 
  filename: 'filename.csv',
  data: [{'a': '1', 'b': 2'}],
  columns: ['a','b']
});

https://github.com/mholt/PapaParse/issues/175 - ब्राउज़र समर्थन चर्चा के लिए यह टिप्पणी देखें।


10

आप जावास्क्रिप्ट का उपयोग करके CSV फ़ाइल में सरणी निर्यात करने के लिए कोड के नीचे के टुकड़े का उपयोग कर सकते हैं।

यह विशेष पात्रों को भी संभालता है

var arrayContent = [["Séjour 1, é,í,ú,ü,ű"],["Séjour 2, é,í,ú,ü,ű"]];
var csvContent = arrayContent.join("\n");
var link = window.document.createElement("a");
link.setAttribute("href", "data:text/csv;charset=utf-8,%EF%BB%BF" + encodeURI(csvContent));
link.setAttribute("download", "upload_data.csv");
link.click(); 

यहां काम करने वाली jsfiddle की लिंक दी गई है


1
विशेष पात्रों के लिए सर्वश्रेष्ठ उत्तर
एलेजांद्रो

# (हैशटैग) काम नहीं करता है!
नक्र्स

7
//It work in Chrome and IE ... I reviewed and readed a lot of answer. then i used it and tested in both ... 

var link = document.createElement("a");

if (link.download !== undefined) { // feature detection
    // Browsers that support HTML5 download attribute
    var blob = new Blob([CSV], { type: 'text/csv;charset=utf-8;' });
    var url = URL.createObjectURL(blob);            
    link.setAttribute("href", url);
    link.setAttribute("download", fileName);
    link.style = "visibility:hidden";
}

if (navigator.msSaveBlob) { // IE 10+
   link.addEventListener("click", function (event) {
     var blob = new Blob([CSV], {
       "type": "text/csv;charset=utf-8;"
     });
   navigator.msSaveBlob(blob, fileName);
  }, false);
}

document.body.appendChild(link);
link.click();
document.body.removeChild(link);

//Regards

6

सीएसवी डेटा .ie के साथ एक बूँद बनाएँ var blob = new Blob([data], type:"text/csv");

यदि ब्राउज़र ब्लोब्स को बचाने का समर्थन करता है if window.navigator.mSaveOrOpenBlob)===true, तो csv डेटा का उपयोग करके सहेजें: window.navigator.msSaveBlob(blob, 'filename.csv')

यदि ब्राउज़र ब्लूबिंग को बचाने और खोलने का समर्थन नहीं करता है, तो csv डेटा को इस रूप में सहेजें:

var downloadLink = document.createElement('<a></a>');
downloadLink.attr('href', window.URL.createObjectURL(blob));
downloadLink.attr('download', filename);
downloadLink.attr('target', '_blank');
document.body.append(downloadLink);

पूर्ण कोड स्निपेट:

var filename = 'data_'+(new Date()).getTime()+'.csv';
var charset = "utf-8";
var blob = new Blob([data], {
     type: "text/csv;charset="+ charset + ";"
});
if (window.navigator.msSaveOrOpenBlob) {
     window.navigator.msSaveBlob(blob, filename);
} else {
    var downloadLink = document.element('<a></a>');
    downloadLink.attr('href', window.URL.createObjectURL(blob));
    downloadLink.attr('download', filename);
    downloadLink.attr('target', '_blank');  
    document.body.append(downloadLink); 
    downloadLink[0].click(); 
}

5

यहाँ दो प्रश्न हैं:

  1. कैसे एक सरणी को सीएसवी स्ट्रिंग में परिवर्तित करें
  2. उस स्ट्रिंग को किसी फाइल में कैसे सेव करें

पहले सवाल के सभी जवाब (एक मिलीमीटर को छोड़कर) यहाँ एक ओवरकिल की तरह लग रहे हैं। और मिलीमीटर द्वारा एक व्यक्ति को आवधिक आवश्यकताओं को कवर नहीं किया जाता है, जैसे उद्धरण के साथ आसपास के तार या वस्तुओं के एरे को परिवर्तित करना।

यहाँ मेरे इस पर ले जाता है:

एक सरल सीएसवी के लिए एक नक्शा () और एक जोड़ () पर्याप्त हैं:

    var test_array = [["name1", 2, 3], ["name2", 4, 5], ["name3", 6, 7], ["name4", 8, 9], ["name5", 10, 11]];
    var csv = test_array.map(function(d){
        return d.join();
    }).join('\n');

    /* Results in 
    name1,2,3
    name2,4,5
    name3,6,7
    name4,8,9
    name5,10,11

यह विधि आपको आंतरिक सम्मिलित में कॉमा से अलग स्तंभ विभाजक को निर्दिष्ट करने की भी अनुमति देती है। उदाहरण के लिए एक टैब:d.join('\t')

दूसरी ओर यदि आप इसे ठीक से करना चाहते हैं और उद्धरण "" में तारों को जोड़ना चाहते हैं, तो आप कुछ JSON मैजिक का उपयोग कर सकते हैं:

var csv = test_array.map(function(d){
       return JSON.stringify(d);
    })
    .join('\n') 
    .replace(/(^\[)|(\]$)/mg, ''); // remove opening [ and closing ]
                                   // brackets from each line 

/* would produce
"name1",2,3
"name2",4,5
"name3",6,7
"name4",8,9
"name5",10,11

यदि आपके पास वस्तुओं का प्रकार है:

var data = [
  {"title": "Book title 1", "author": "Name1 Surname1"},
  {"title": "Book title 2", "author": "Name2 Surname2"},
  {"title": "Book title 3", "author": "Name3 Surname3"},
  {"title": "Book title 4", "author": "Name4 Surname4"}
];

// use
var csv = data.map(function(d){
        return JSON.stringify(Object.values(d));
    })
    .join('\n') 
    .replace(/(^\[)|(\]$)/mg, '');

अगर मैं गलत नहीं हूं तो मेरा मानना ​​है कि .replaceहमें वर्ली बनाम स्क्वायर ब्रैकेट्स को निर्दिष्ट करना चाहिए।
एरोनबार्टेल

.replaceएक स्ट्रिंग पर किया जाता है, values()जो एक वस्तु लेता है और मूल्यों की एक सरणी देता है
कोन्स्टेंटिन

values()जब मैंने आपका कोड आज़माया, तो यह विधि नहीं मिली।
एरोनबार्टेल

धन्यवाद! क्रोम में यह values()स्पष्ट रूप से कॉल किए बिना काम करता है Object। मैंने उदाहरण को सही किया।
कॉन्सटेंटिन

5

डेटा को CSV में परिवर्तित करने के लिए यहां बहुत सारे रोल-खुद के समाधान हैं, लेकिन उन सभी के बारे में डेटा के प्रकार के संदर्भ में विभिन्न कैविएट होंगे जो एक्सेल या पसंद को ट्रिप किए बिना सही ढंग से प्रारूपित करेंगे।

क्यों न कुछ सिद्ध किया जाए: पापा पारसे

Papa.unparse(data[, config])

तो बस इसे स्थानीय डाउनलोड समाधानों में से एक के साथ जोड़ दें। @ArneHB द्वारा एक अच्छा लग रहा है।


4

ES6 के साथ एक तीर का कार्य:

const dataToCsvURI = (data) => encodeURI(
`data:text/csv;charset=utf-8,${data.map((row, index) =>  row.join(',')).join(`\n`)}`
);

फिर :

window.open(
  dataToCsvURI(
   [["name1", "city_name1"/*, ...*/], ["name2", "city_name2"/*, ...*/]]
  )
);

मामले में किसी को भी इसके लिए जरूरत है , react-csvउसके लिए है


3
react-csvपुस्तकालय एक आकर्षण की तरह काम करता है। मॉड्यूल का उपयोग कर किसी के लिए महान समाधान।
मैट पैरीला

यह उस मामले का निरीक्षण करने में विफल रहता है जिसमें CSV फ़ाइल के अंदर कॉमा के साथ फ़ील्ड होते हैं।
अनपॉलिटो

2

मैं अपने जावा GWT एप्लिकेशन में क्लाइंट साइड पर CSV फ़ाइलों को कैसे डाउनलोड करूं। उसके समाधान के लिए जेवियर जॉन को विशेष धन्यवाद। इसे FF 24.6.0, IE 11.0.20 और Chrome 45.0.2454.99 (64-बिट) में काम करने के लिए सत्यापित किया गया है। मुझे आशा है कि यह किसी को थोड़ा समय बचाता है:

public class ExportFile 
{

    private static final String CRLF = "\r\n";

    public static void exportAsCsv(String filename, List<List<String>> data) 
    {
        StringBuilder sb = new StringBuilder();
        for(List<String> row : data) 
        {
            for(int i=0; i<row.size(); i++)
            {
                if(i>0) sb.append(",");
                sb.append(row.get(i));
            }
            sb.append(CRLF);
        }

        generateCsv(filename, sb.toString());
    }

    private static native void generateCsv(String filename, String text)
    /*-{
        var blob = new Blob([text], { type: 'text/csv;charset=utf-8;' });

        if (navigator.msSaveBlob) // IE 10+
        { 
            navigator.msSaveBlob(blob, filename);
        } 
        else 
        {
            var link = document.createElement("a");
            if (link.download !== undefined) // feature detection
            { 
                // Browsers that support HTML5 download attribute
                var url = URL.createObjectURL(blob);
                link.setAttribute("href", url);
                link.setAttribute("download", filename);
                link.style.visibility = 'hidden';
                document.body.appendChild(link);
                link.click();
                document.body.removeChild(link);
            }
        }
    }-*/;
}

1

यहाँ एक कोणीय अनुकूल संस्करण है:

  constructor(private location: Location, private renderer: Renderer2) {}

  download(content, fileName, mimeType) {

    const a = this.renderer.createElement('a');

    mimeType = mimeType || 'application/octet-stream';

    if (navigator.msSaveBlob) {

      navigator.msSaveBlob(new Blob([content], {
        type: mimeType
      }), fileName);
    }
    else if (URL && 'download' in a) {

      const id = GetUniqueID();

      this.renderer.setAttribute(a, 'id', id);
      this.renderer.setAttribute(a, 'href', URL.createObjectURL(new Blob([content], {
        type: mimeType
      })));

      this.renderer.setAttribute(a, 'download', fileName);

      this.renderer.appendChild(document.body, a);

      const anchor = this.renderer.selectRootElement(`#${id}`);

      anchor.click();

      this.renderer.removeChild(document.body, a);
    }
    else {
      this.location.go(`data:application/octet-stream,${encodeURIComponent(content)}`);
    }
  };

1

उपरोक्त उत्तर काम करते हैं, लेकिन ध्यान रखें कि यदि आप .xls प्रारूप में खोल रहे हैं, तो कॉलम ~~ '\t'इसके बजाय ~~ से अलग हो सकते हैं ',', उत्तर https://stackoverflow.com/a/14966131/6169225 ने अच्छी तरह से काम किया मेरे लिए, तब तक जब तक मैं .join('\t')सरणियों पर इस्तेमाल करता था .join(',')


.xls फ़ाइलों के लिए अच्छी तरह से काम करता है, BTW मैं एक छोटी सी समस्या है, जब पाठ बहुत लंबा है और ग्रिड के आकार से अधिक हो जाता है तो शीट बहुत अच्छी तरह से नहीं दिखती है, इसे हल करने के लिए कोई संकेत?
gabrielAnzaldo

1

मैं इस फ़ंक्शन का उपयोग string[][]एक सीएसवी फ़ाइल में परिवर्तित करने के लिए करता हूं । यह एक सेल को उद्धृत करता है, यदि इसमें एक ", ,या अन्य व्हाट्सएप (रिक्त को छोड़कर) शामिल है:

/**
 * Takes an array of arrays and returns a `,` sparated csv file.
 * @param {string[][]} table
 * @returns {string}
 */
function toCSV(table) {
    return table
        .map(function(row) {
            return row
                .map(function(cell) {
                    // We remove blanks and check if the column contains
                    // other whitespace,`,` or `"`.
                    // In that case, we need to quote the column.
                    if (cell.replace(/ /g, '').match(/[\s,"]/)) {
                        return '"' + cell.replace(/"/g, '""') + '"';
                    }
                    return cell;
                })
                .join(',');
        })
        .join('\n'); // or '\r\n' for windows

}

नोट : इंटरनेट एक्सप्लोरर <11 पर काम नहीं करता है जब तक mapकि पॉलीफ़िल्ड न हो।

नोट : यदि कोशिकाओं में नंबर होते हैं, तो आप संख्याओं को स्ट्रिंग्स में बदलने cell=''+cellसे पहले जोड़ सकते हैं if (cell.replace...

या आप इसे ES6 का उपयोग करके एक पंक्ति में लिख सकते हैं:

t.map(r=>r.map(c=>c.replace(/ /g, '').match(/[\s,"]/)?'"'+c.replace(/"/g,'""')+'"':c).join(',')).join('\n')

1

मैं PapaParse जैसे पुस्तकालय का उपयोग करने की सलाह दूंगा: https://github.com/mholt/PapaParse

वर्तमान में स्वीकृत उत्तर में कई समस्याएं शामिल हैं:

  • यदि डेटा में अल्पविराम हो तो यह विफल रहता है
  • यह विफल रहता है यदि डेटा में एक लाइनब्रेक है
  • यदि डेटा में उद्धरण चिह्न है तो यह (प्रकार) विफल रहता है

1

बस यह प्रयास करें, यहां कुछ उत्तर यूनिकोड डेटा और डेटा को संभाल नहीं रहे हैं, जो उदाहरण की तारीख के लिए अल्पविराम है।

function downloadUnicodeCSV(filename, datasource) {
    var content = '', newLine = '\r\n';
    for (var _i = 0, datasource_1 = datasource; _i < datasource_1.length; _i++) {
        var line = datasource_1[_i];
        var i = 0;
        for (var _a = 0, line_1 = line; _a < line_1.length; _a++) {
            var item = line_1[_a];
            var it = item.replace(/"/g, '""');
            if (it.search(/("|,|\n)/g) >= 0) {
                it = '"' + it + '"';
            }
            content += (i > 0 ? ',' : '') + it;
            ++i;
        }
        content += newLine;
    }
    var link = document.createElement('a');
    link.setAttribute('href', 'data:text/csv;charset=utf-8,%EF%BB%BF' + encodeURIComponent(content));
    link.setAttribute('download', filename);
    link.style.visibility = 'hidden';
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
};

1

CSV फ़ाइल डाउनलोड करें

  let csvContent = "data:text/csv;charset=utf-8,";
  rows.forEach(function (rowArray) {
    for (var i = 0, len = rowArray.length; i < len; i++) {
      if (typeof (rowArray[i]) == 'string')
        rowArray[i] = rowArray[i].replace(/<(?:.|\n)*?>/gm, '');
      rowArray[i] = rowArray[i].replace(/,/g, '');
    }

    let row = rowArray.join(",");
    csvContent += row + "\r\n"; // add carriage return
  });
  var encodedUri = encodeURI(csvContent);
  var link = document.createElement("a");
  link.setAttribute("href", encodedUri);
  link.setAttribute("download", "fileName.csv");
  document.body.appendChild(link);
  link.click();

1

निम्नलिखित एक देशी js समाधान है।

function export2csv() {
  let data = "";
  const tableData = [];
  const rows = [
    ['111', '222', '333'],
    ['aaa', 'bbb', 'ccc'],
    ['AAA', 'BBB', 'CCC']
  ];
  for (const row of rows) {
    const rowData = [];
    for (const column of row) {
      rowData.push(column);
    }
    tableData.push(rowData.join(","));
  }
  data += tableData.join("\n");
  const a = document.createElement("a");
  a.href = URL.createObjectURL(new Blob([data], { type: "text/csv" }));
  a.setAttribute("download", "data.csv");
  document.body.appendChild(a);
  a.click();
  document.body.removeChild(a);
}
<button onclick="export2csv()">Export array to csv file</button>


मेरे लिए पूरी तरह से काम किया। धन्यवाद!
श्रीजनी घोष

0

यदि किसी को नॉकआउट जेएस के लिए इसकी आवश्यकता है, तो यह मूल रूप से प्रस्तावित समाधान के साथ ठीक काम करता है:

एचटीएमएल:

<a data-bind="attr: {download: filename, href: csvContent}">Download</a>

मॉडल देखें:

// for the download link
this.filename = ko.computed(function () {
    return ko.unwrap(this.id) + '.csv';
}, this);
this.csvContent = ko.computed(function () {
    if (!this.csvLink) {
        var data = ko.unwrap(this.data),
            ret = 'data:text/csv;charset=utf-8,';

        ret += data.map(function (row) {
            return row.join(',');
        }).join('\n');

        return encodeURI(ret);
    }
}, this);

0

मैंने जेवियर जॉन्स फंक्शन में शामिल किया, यदि आवश्यक हो तो फील्ड हेडर भी शामिल करें, हालांकि jQuery का उपयोग करता है। $ .Each बिट को एक देशी जावास्क्रिप्ट लूप के लिए बदलने की आवश्यकता होगी

function exportToCsv(filename, rows, headers = false) {
    var processRow = function (row) {
        row = $.map(row, function(value, index) {
            return [value];
        });
        var finalVal = '';
        for (var j = 0; j < row.length; j++) {
            if(i == 0 && j == 0 && headers == true){
                var ii = 0;
                $.each(rows[i], function( index, value ) {
                    //console.log(index);
                    var fieldName = index === null ? '' : index.toString();
                    //console.log(fieldName);
                    var fieldResult = fieldName.replace(/"/g, '""');
                    //console.log(fieldResult);
                    if (fieldResult.search(/("|,|\n)/g) >= 0){
                        fieldResult = '"' + fieldResult + '"';
                    }
                    //console.log(fieldResult);
                    if (ii > 0){
                        finalVal += ',';
                        finalVal += fieldResult;
                    }else{
                        finalVal += fieldResult;
                    }
                    ii++;
                    //console.log(finalVal);
                });
                finalVal += '\n';
                //console.log('end: '+finalVal);
            }
            var innerValue = row[j] === null ? '' : row[j].toString();
            if (row[j] instanceof Date) {
                innerValue = row[j].toLocaleString();
            };
            var result = innerValue.replace(/"/g, '""');
            if (result.search(/("|,|\n)/g) >= 0){
                result = '"' + result + '"';
            }
            if (j > 0){
                finalVal += ',';
                finalVal += result;
            }else{
                finalVal += result;
            }
        }
        return finalVal + '\n';
    };
    var csvFile = '';
    for (var i = 0; i < rows.length; i++) {
        csvFile += processRow(rows[i]);
    }
    var blob = new Blob([csvFile], { type: 'text/csv;charset=utf-8;' });
    if (navigator.msSaveBlob) { // IE 10+
        navigator.msSaveBlob(blob, filename);
    }else{
        var link = document.createElement("a");
        if (link.download !== undefined) { // feature detection
            // Browsers that support HTML5 download attribute
            var url = URL.createObjectURL(blob);
            link.setAttribute("href", url);
            link.setAttribute("download", filename);
            link.style.visibility = 'hidden';
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
        }
    }
}

0

यह एक संशोधित उत्तर है जो स्वीकार किए गए उत्तर पर आधारित है जिसमें JSON से डेटा आ रहा होगा।

            JSON Data Ouptut:
             0 :{emails: "SAMPLE Co., peter@samplecompany.com"}, 1:{emails: "Another CO. , ronald@another.com"}


            JS:
            $.getJSON('yourlink_goes_here', { if_you_have_parameters}, function(data) {
            var csvContent = "data:text/csv;charset=utf-8,";
            var dataString = '';
             $.each(data, function(k, v) {
                dataString += v.emails + "\n";
             });

            csvContent += dataString;

            var encodedUri = encodeURI(csvContent);
            var link = document.createElement("a");
            link.setAttribute("href", encodedUri);
            link.setAttribute("download", "your_filename.csv");
            document.body.appendChild(link); // Required for FF

            link.click();
        });

0

यदि आप वास्तव में त्वरित समाधान की तलाश में हैं तो आप इस छोटी सी लाइब्रेरी को भी मौका दे सकते हैं जो आपके लिए CSV फ़ाइल बनाएगी और डाउनलोड करेगी: https://github.com/mbrn/filefy

उपयोग बहुत सरल है:

import { CsvBuilder } from 'filefy';

var csvBuilder = new CsvBuilder("user_list.csv")
  .setColumns(["name", "surname"])
  .addRow(["Eve", "Holt"])
  .addRows([
    ["Charles", "Morris"],
    ["Tracey", "Ramos"]
  ])
  .exportFile();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.