You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							132 lines
						
					
					
						
							3.5 KiB
						
					
					
				
			
		
		
	
	
							132 lines
						
					
					
						
							3.5 KiB
						
					
					
				| var getDelimiter = require("./getDelimiter");
 | |
| var filterRow=require("./filterRow");
 | |
| /**
 | |
|  * Convert a line of string to csv columns according to its delimiter
 | |
|  * the param._header may not be ready when this is called.
 | |
|  * @param  {[type]} rowStr [description]
 | |
|  * @param  {[type]} param  [Converter param]
 | |
|  * @return {[type]}        {cols:["a","b","c"],closed:boolean} the closed field indicate if the row is a complete row
 | |
|  */
 | |
| module.exports = function rowSplit(rowStr, param) {
 | |
|   if (rowStr === "") {
 | |
|     return { cols: [], closed: true };
 | |
|   }
 | |
|   var quote = param.quote;
 | |
|   var trim = param.trim;
 | |
|   var escape = param.escape;
 | |
|   if (param.delimiter instanceof Array || param.delimiter.toLowerCase() === "auto") {
 | |
|     param.delimiter = getDelimiter(rowStr, param);
 | |
|   }
 | |
|   var delimiter = param.delimiter;
 | |
|   var rowArr = rowStr.split(delimiter);
 | |
|   if (quote === "off") {
 | |
|     return { cols: rowArr, closed: true };
 | |
|   }
 | |
|   var row = [];
 | |
|   var inquote = false;
 | |
|   var quoteBuff = '';
 | |
|   for (var i = 0, rowLen = rowArr.length; i < rowLen; i++) {
 | |
|     var e = rowArr[i];
 | |
|     if (!inquote && trim) {
 | |
|       e = e.trim();
 | |
|     }
 | |
|     var len = e.length;
 | |
|     if (!inquote) {
 | |
|       if (isQuoteOpen(e, param)) { //quote open
 | |
|         e = e.substr(1);
 | |
|         if (isQuoteClose(e, param)) { //quote close
 | |
|           e = e.substring(0, e.length - 1);
 | |
|           e = _escapeQuote(e, quote, escape);
 | |
|           row.push(e);
 | |
|           continue;
 | |
|         } else {
 | |
|           inquote = true;
 | |
|           quoteBuff += e;
 | |
|           continue;
 | |
|         }
 | |
|       } else {
 | |
|         row.push(e);
 | |
|         continue;
 | |
|       }
 | |
|     } else { //previous quote not closed
 | |
|       if (isQuoteClose(e, param)) { //close double quote
 | |
|         inquote = false;
 | |
|         e = e.substr(0, len - 1);
 | |
|         quoteBuff += delimiter + e;
 | |
|         quoteBuff = _escapeQuote(quoteBuff, quote, escape);
 | |
|         if (trim) {
 | |
|           quoteBuff = quoteBuff.replace(/\s+$/, "");
 | |
|         }
 | |
|         row.push(quoteBuff);
 | |
|         quoteBuff = "";
 | |
|       } else {
 | |
|         quoteBuff += delimiter + e;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (!inquote && param._needFilterRow) {
 | |
|     row = filterRow(row, param);
 | |
|   }
 | |
| 
 | |
|   return { cols: row, closed: !inquote };
 | |
|   // if (param.workerNum<=1){
 | |
|   // }else{
 | |
|   //   if (inquote && quoteBuff.length>0){//for multi core, quote will be closed at the end of line
 | |
|   //     quoteBuff=_escapeQuote(quoteBuff,quote,escape);;
 | |
|   //     if (trim){
 | |
|   //       quoteBuff=quoteBuff.trimRight();
 | |
|   //     }
 | |
|   //     row.push(quoteBuff);
 | |
|   //   }
 | |
|   //   return {cols:row,closed:true};
 | |
|   // }
 | |
| 
 | |
| };
 | |
| 
 | |
| 
 | |
| 
 | |
| function isQuoteOpen(str, param) {
 | |
|   var quote = param.quote;
 | |
|   var escape = param.escape;
 | |
|   return str[0] === quote && (
 | |
|     str[1] !== quote ||
 | |
|     str[1] === escape && (str[2] === quote || str.length === 2));
 | |
| }
 | |
| function isQuoteClose(str, param) {
 | |
|   var quote = param.quote;
 | |
|   var count = 0;
 | |
|   var idx = str.length - 1;
 | |
|   var escape = param.escape;
 | |
|   while (str[idx] === quote || str[idx] === escape) {
 | |
|     idx--;
 | |
|     count++;
 | |
|   }
 | |
|   return count % 2 !== 0;
 | |
| }
 | |
| 
 | |
| function twoDoubleQuote(str, quote) {
 | |
|   var twoQuote = quote + quote;
 | |
|   var curIndex = -1;
 | |
|   while ((curIndex = str.indexOf(twoQuote, curIndex)) > -1) {
 | |
|     str = str.substring(0, curIndex) + str.substring(++curIndex);
 | |
|   }
 | |
|   return str;
 | |
| }
 | |
| 
 | |
| var cachedRegExp = {};
 | |
| function _escapeQuote(segment, quote, escape) {
 | |
| 
 | |
|   var key = "es|" + quote + "|" + escape;
 | |
|   if (cachedRegExp[key] === undefined) {
 | |
| 
 | |
|     // if (escape === "\\") {
 | |
|     //   escape = "\\\\";
 | |
|     // }
 | |
|     cachedRegExp[key] = new RegExp('\\'+escape + '\\'+quote, 'g');
 | |
|   }
 | |
|   var regExp = cachedRegExp[key];
 | |
|   // console.log(regExp,segment);
 | |
|   return segment.replace(regExp, quote);
 | |
| }
 |