tabla read leer importar exportar example crear con como archivos archivo javascript csv

read - Código Javascript para analizar datos CSV



leer csv javascript (8)

Esta pregunta ya tiene una respuesta aquí:

¿Alguien tiene una idea sobre dónde podría encontrar algún código de JavaScript para analizar datos CSV?



Aquí está mi gramática PEG (.js) que parece funcionar bien en RFC 4180 (es decir, maneja los ejemplos en http://en.wikipedia.org/wiki/Comma-separated_values ):

start = [/n/r]* first:line rest:([/n/r]+ data:line { return data; })* [/n/r]* { rest.unshift(first); return rest; } line = first:field rest:("," text:field { return text; })* & { return !!first || rest.length; } // ignore blank lines { rest.unshift(first); return rest; } field = ''"'' text:char* ''"'' { return text.join(''''); } / text:[^/n/r,]* { return text.join(''''); } char = ''"'' ''"'' { return ''"''; } / [^"]

Pruébelo en http://jsfiddle.net/knvzk/10 o http://pegjs.majda.cz/online . Descargue el analizador generado en https://gist.github.com/3362830 .


Aquí hay un analizador CSV extremadamente simple que maneja campos cotizados con comas, nuevas líneas y comillas dobles escapadas. No hay división o RegEx. Escanea la cadena de entrada de 1 a 2 caracteres a la vez y crea una matriz.

Pruébelo en http://jsfiddle.net/vHKYH/ .

function parseCSV(str) { var arr = []; var quote = false; // true means we''re inside a quoted field // iterate over each character, keep track of current row and column (of the returned array) for (var row = col = c = 0; c < str.length; c++) { var cc = str[c], nc = str[c+1]; // current character, next character arr[row] = arr[row] || []; // create a new row if necessary arr[row][col] = arr[row][col] || ''''; // create a new column (start with empty string) if necessary // If the current character is a quotation mark, and we''re inside a // quoted field, and the next character is also a quotation mark, // add a quotation mark to the current column and skip the next character if (cc == ''"'' && quote && nc == ''"'') { arr[row][col] += cc; ++c; continue; } // If it''s just one quotation mark, begin/end quoted field if (cc == ''"'') { quote = !quote; continue; } // If it''s a comma and we''re not in a quoted field, move on to the next column if (cc == '','' && !quote) { ++col; continue; } // If it''s a newline (CRLF) and we''re not in a quoted field, skip the next character // and move on to the next row and move to column 0 of that new row if (cc == ''/r'' && nc == ''/n'' && !quote) { ++row; col = 0; ++c; continue; } // If it''s a newline (LF or CR) and we''re not in a quoted field, // move on to the next row and move to column 0 of that new row if (cc == ''/n'' && !quote) { ++row; col = 0; continue; } if (cc == ''/r'' && !quote) { ++row; col = 0; continue; } // Otherwise, append the current character to the current column arr[row][col] += cc; } return arr; }


Creo que puedo vencer la respuesta de Kirtan

Ingrese jQuery-CSV

Es un plugin de jquery diseñado para funcionar como una solución de extremo a extremo para analizar CSV en datos de Javascript. Maneja todos los casos de borde presentados en RFC 4180 , así como algunos que aparecen para las exportaciones de Excel / Google Spreadsheed (es decir, en su mayoría involucran valores nulos) que la especificación falta.

Ejemplo:

pista, artista, álbum, año

Peligroso, ''Busta Rhymes'', ''Cuando ocurre un desastre'', 1997

// calling this music = $.csv.toArrays(csv) // outputs... [ ["track","artist","album","year"], ["Dangerous","Busta Rhymes","When Disaster Strikes","1997"] ] console.log(music[1][2]) // outputs: ''When Disaster Strikes''

Actualizar:

Ah, sí, también debería mencionar que es completamente configurable.

music = $.csv.toArrays(csv, { delimiter:"''", // sets a custom value delimiter character separator:'';'', // sets a custom field separator character });

Actualización 2:

Ahora funciona con jQuery en Node.js también. Por lo tanto, tiene la opción de realizar un análisis del lado del cliente o del lado del servidor con la misma biblioteca.

Actualización 3:

Desde el cierre de Google Code, jquery-csv se ha migrado a GitHub .

Descargo de responsabilidad: también soy el autor de jQuery-CSV.


No estoy seguro de por qué no pude kirtans, ex. para trabajar para mi Parecía estar fallando en campos vacíos o tal vez campos con comas finales ...

Este parece manejar ambos.

No escribí el código del analizador, solo un envoltorio alrededor de la función del analizador para que esto funcione para un archivo. ver Atribución

var Strings = { /** * Wrapped csv line parser * @param s string delimited csv string * @param sep separator override * @attribution : http://www.greywyvern.com/?post=258 (comments closed on blog :( ) */ parseCSV : function(s,sep) { // http://.com/questions/1155678/javascript-string-newline-character var universalNewline = //r/n|/r|/n/g; var a = s.split(universalNewline); for(var i in a){ for (var f = a[i].split(sep = sep || ","), x = f.length - 1, tl; x >= 0; x--) { if (f[x].replace(/"/s+$/, ''"'').charAt(f[x].length - 1) == ''"'') { if ((tl = f[x].replace(/^/s+"/, ''"'')).length > 1 && tl.charAt(0) == ''"'') { f[x] = f[x].replace(/^/s*"|"/s*$/g, '''').replace(/""/g, ''"''); } else if (x) { f.splice(x - 1, 2, [f[x - 1], f[x]].join(sep)); } else f = f.shift().split(sep).concat(f); } else f[x].replace(/""/g, ''"''); } a[i] = f; } return a; } }


Puede usar la función CSVToArray() mencionada en esta entrada de blog.

<script type="text/javascript"> // ref: http://.com/a/1293163/2343 // This will parse a delimited string into an array of // arrays. The default delimiter is the comma, but this // can be overriden in the second argument. function CSVToArray( strData, strDelimiter ){ // Check to see if the delimiter is defined. If not, // then default to comma. strDelimiter = (strDelimiter || ","); // Create a regular expression to parse the CSV values. var objPattern = new RegExp( ( // Delimiters. "(//" + strDelimiter + "|//r?//n|//r|^)" + // Quoted fields. "(?:/"([^/"]*(?:/"/"[^/"]*)*)/"|" + // Standard fields. "([^/"//" + strDelimiter + "//r//n]*))" ), "gi" ); // Create an array to hold our data. Give the array // a default empty first row. var arrData = [[]]; // Create an array to hold our individual pattern // matching groups. var arrMatches = null; // Keep looping over the regular expression matches // until we can no longer find a match. while (arrMatches = objPattern.exec( strData )){ // Get the delimiter that was found. var strMatchedDelimiter = arrMatches[ 1 ]; // Check to see if the given delimiter has a length // (is not the start of string) and if it matches // field delimiter. If id does not, then we know // that this delimiter is a row delimiter. if ( strMatchedDelimiter.length && strMatchedDelimiter !== strDelimiter ){ // Since we have reached a new row of data, // add an empty row to our data array. arrData.push( [] ); } var strMatchedValue; // Now that we have our delimiter out of the way, // let''s check to see which kind of value we // captured (quoted or unquoted). if (arrMatches[ 2 ]){ // We found a quoted value. When we capture // this value, unescape any double quotes. strMatchedValue = arrMatches[ 2 ].replace( new RegExp( "/"/"", "g" ), "/"" ); } else { // We found a non-quoted value. strMatchedValue = arrMatches[ 3 ]; } // Now that we have our value string, let''s add // it to the data array. arrData[ arrData.length - 1 ].push( strMatchedValue ); } // Return the parsed data. return( arrData ); } </script>


Tengo una implementation como parte de un proyecto de hoja de cálculo.

Este código aún no se ha probado a fondo, pero cualquiera puede usarlo.

Sin embargo, como se señalaron algunas de las respuestas, su implementación puede ser mucho más simple si realmente tiene archivos DSV o TSV , ya que no permiten el uso del registro y los separadores de campo en los valores. CSV, por otro lado, puede tener comas y líneas nuevas dentro de un campo, lo que rompe la mayoría de los enfoques regex y split-based.

var CSV = { parse: function(csv, reviver) { reviver = reviver || function(r, c, v) { return v; }; var chars = csv.split(''''), c = 0, cc = chars.length, start, end, table = [], row; while (c < cc) { table.push(row = []); while (c < cc && ''/r'' !== chars[c] && ''/n'' !== chars[c]) { start = end = c; if (''"'' === chars[c]){ start = end = ++c; while (c < cc) { if (''"'' === chars[c]) { if (''"'' !== chars[c+1]) { break; } else { chars[++c] = ''''; } // unescape "" } end = ++c; } if (''"'' === chars[c]) { ++c; } while (c < cc && ''/r'' !== chars[c] && ''/n'' !== chars[c] && '','' !== chars[c]) { ++c; } } else { while (c < cc && ''/r'' !== chars[c] && ''/n'' !== chars[c] && '','' !== chars[c]) { end = ++c; } } row.push(reviver(table.length-1, row.length, chars.slice(start, end).join(''''))); if ('','' === chars[c]) { ++c; } } if (''/r'' === chars[c]) { ++c; } if (''/n'' === chars[c]) { ++c; } } return table; }, stringify: function(table, replacer) { replacer = replacer || function(r, c, v) { return v; }; var csv = '''', c, cc, r, rr = table.length, cell; for (r = 0; r < rr; ++r) { if (r) { csv += ''/r/n''; } for (c = 0, cc = table[r].length; c < cc; ++c) { if (c) { csv += '',''; } cell = replacer(r, c, table[r][c]); if (/[,/r/n"]/.test(cell)) { cell = ''"'' + cell.replace(/"/g, ''""'') + ''"''; } csv += (cell || 0 === cell) ? cell : ''''; } } return csv; } };


csvToArray v1.3

Una función compacta (645 bytes) pero compatible para convertir una cadena CSV en una matriz 2D, conforme al estándar RFC4180.

https://code.google.com/archive/p/csv-to-array/downloads

Uso común: jQuery

$.ajax({ url: "test.csv", dataType: ''text'', cache: false }).done(function(csvAsString){ csvAsArray=csvAsString.csvToArray(); });

Uso común: Javascript

csvAsArray = csvAsString.csvToArray();

Anular separador de campo

csvAsArray = csvAsString.csvToArray("|");

Anular separador de registro

csvAsArray = csvAsString.csvToArray("", "#");

Anular encabezado saltado

csvAsArray = csvAsString.csvToArray("", "", 1);

Anular todo

csvAsArray = csvAsString.csvToArray("|", "#", 1);