View Issue Details

This bug affects 1 person(s).
 8
IDProjectCategoryView StatusLast Update
17677Bug reportsImport/Exportpublic2022-03-08 08:57
ReporterDenisChenu Assigned ToDenisChenu  
PrioritynoneSeverityfeature 
Status closedResolutionfixed 
Summary17677: Valid TSV file can not be used in VV import
Description

VV import didn't work with line feed in header or in value

This can be great to have

  • Subquestion in header , or some detail in header (1st line) : better shown in multiline
  • Use copy/paste in value : need line feed

This can be fixed using \n replace by {newline} , but more easy is usage more easy is …

Additional Information

Can be fixed but use iconv on each element.
I think we already have iconv used ?

(see https://github.com/wilgucki/php-csv/blob/06721264c4fdfa55c9b18bb1e5f2c0419487e8c1/src/Reader.php#L126 for a sample of usage).

TagsNo tags attached.
Bug heat8
Complete LimeSurvey version number (& build) 3.27.25
I will donate to the project if issue is resolved
Browsernot relevant
Database type & versionnot relevant
Server OS (if known)not relevant
Webserver software & version (if known)nginx
PHP Version7.4

Relationships

parent of 17678 closedDenisChenu Feature requests VV export didn't shown sub question 

Users monitoring this issue

There are no users monitoring this issue.

Activities

DenisChenu

DenisChenu

2021-10-25 12:32

developer   ~66924

vvexport_629533_headerLineFeed.csv (426 bytes)   
"ID de la réponse"	"token"	"Date de soumission"	"Dernière page"	"Langue de départ"	"Tête de série"	"Une première question comme exemple. Veuillez répondre à cette question :
Rang 1"	"Une première question comme exemple. Veuillez répondre à cette question :
Rang 2"
"id"	"token"	"submitdate"	"lastpage"	"startlanguage"	"seed"	"Q00_1"	"Q00_2"
1	"{question_not_shown}"	"1980-01-01 00:00:00"	1	"fr"	723848058	"A3"	"A2"
vvexport_629533_valueLineFeed.csv (417 bytes)   
"ID de la réponse"	"Dernière page"	"Langue de départ"	"Une première question comme exemple. Veuillez répondre à cette question"	"Une première question comme exemple. Veuillez répondre à cette question "	"MultiLine"
"id"	"lastpage"	"startlanguage"	"Q00_1"	"Q00_2"	"MultiLine"
1	1	"fr"	"A3"	"A2"	"MultiLigne 1 1
MultiLigne  1 2
MultiLigne 1 3"
1	1	"fr"	"A3"	"A2"	"MultiLigne 2 1
MultiLigne 2 2
MultiLigne 2 3"
PHP notice -Value.html (23,285 bytes)   
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>PHP notice</title>

<style type="text/css">
/*<![CDATA[*/
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{border:0;outline:0;font-size:100%;vertical-align:baseline;background:transparent;margin:0;padding:0;}
body{line-height:1;}
ol,ul{list-style:none;}
blockquote,q{quotes:none;}
blockquote:before,blockquote:after,q:before,q:after{content:none;}
:focus{outline:0;}
ins{text-decoration:none;}
del{text-decoration:line-through;}
table{border-collapse:collapse;border-spacing:0;}

body {
	font: normal 9pt "Verdana";
	color: #000;
	background: #fff;
}

h1 {
	font: normal 18pt "Verdana";
	color: #f00;
	margin-bottom: .5em;
}

h2 {
	font: normal 14pt "Verdana";
	color: #800000;
	margin-bottom: .5em;
}

h3 {
	font: bold 11pt "Verdana";
}

pre {
	font: normal 11pt Menlo, Consolas, "Lucida Console", Monospace;
}

pre span.error {
	display: block;
	background: #fce3e3;
}

pre span.ln {
	color: #999;
	padding-right: 0.5em;
	border-right: 1px solid #ccc;
}

pre span.error-ln {
	font-weight: bold;
}

.container {
	margin: 1em 4em;
}

.version {
	color: gray;
	font-size: 8pt;
	border-top: 1px solid #aaa;
	padding-top: 1em;
	margin-bottom: 1em;
}

.message {
	color: #000;
	padding: 1em;
	font-size: 11pt;
	background: #f3f3f3;
	-webkit-border-radius: 10px;
	-moz-border-radius: 10px;
	border-radius: 10px;
	margin-bottom: 1em;
	line-height: 160%;
}

.source {
	margin-bottom: 1em;
}

.code pre {
	background-color: #ffe;
	margin: 0.5em 0;
	padding: 0.5em;
	line-height: 125%;
	border: 1px solid #eee;
}

.source .file {
	margin-bottom: 1em;
	font-weight: bold;
}

.traces {
	margin: 2em 0;
}

.trace {
	margin: 0.5em 0;
	padding: 0.5em;
}

.trace.app {
	border: 1px dashed #c00;
}

.trace .number {
	text-align: right;
	width: 2em;
	padding: 0.5em;
}

.trace .content {
	padding: 0.5em;
}

.trace .plus,
.trace .minus {
	display:inline;
	vertical-align:middle;
	text-align:center;
	border:1px solid #000;
	color:#000;
	font-size:10px;
	line-height:10px;
	margin:0;
	padding:0 1px;
	width:10px;
	height:10px;
}

.trace.collapsed .minus,
.trace.expanded .plus,
.trace.collapsed pre {
	display: none;
}

.trace-file {
	cursor: pointer;
	padding: 0.2em;
}

.trace-file:hover {
	background: #f0ffff;
}
/*]]>*/
</style>
</head>

<body>
<div class="container">
	<h1>PHP notice</h1>

	<p class="message">
		Undefined offset: 1	</p>

	<div class="source">
		<p class="file">/data/webdev/3LTS/application/helpers/admin/import_helper.php(1977)</p>
		<div class="code"><pre><span class="ln">1965</span>             if ($aOptions['bNotFinalized']) {
<span class="ln">1966</span>                 $oSurvey-&gt;submitdate = new CDbExpression('NULL');
<span class="ln">1967</span>             } elseif (is_int($iSubmitdateKey)) {
<span class="ln">1968</span>                 if ($aResponses[$iSubmitdateKey] == '{question_not_shown}' || trim($aResponses[$iSubmitdateKey] == '')) {
<span class="ln">1969</span>                     $oSurvey-&gt;submitdate = new CDbExpression('NULL');
<span class="ln">1970</span>                 } else {
<span class="ln">1971</span>                     // Maybe control valid date : see http://php.net/manual/en/function.checkdate.php#78362 for example
<span class="ln">1972</span>                     $oSurvey-&gt;submitdate = $aResponses[$iSubmitdateKey];
<span class="ln">1973</span>                 }
<span class="ln">1974</span>             }
<span class="ln">1975</span> 
<span class="ln">1976</span>             foreach ($aKeyForFieldNames as $sFieldName=&gt;$iFieldKey) {
<span class="error"><span class="ln error-ln">1977</span>                 if ($aResponses[$iFieldKey] == '{question_not_shown}') {
</span><span class="ln">1978</span>                     $oSurvey-&gt;$sFieldName = new CDbExpression('NULL');
<span class="ln">1979</span>                 } else {
<span class="ln">1980</span>                     $sResponse = str_replace(array("{quote}", "{tab}", "{cr}", "{newline}", "{lbrace}"), array("\"", "\t", "\r", "\n", "{"), $aResponses[$iFieldKey]);
<span class="ln">1981</span>                     $oSurvey-&gt;$sFieldName = $sResponse;
<span class="ln">1982</span>                 }
<span class="ln">1983</span>             }
<span class="ln">1984</span> 
<span class="ln">1985</span>             //Check if datestamp is set =&gt; throws no default error on importing
<span class="ln">1986</span>             if($oSurvey-&gt;hasAttribute('datestamp') &amp;&amp; !isset($oSurvey-&gt;datestamp)){
<span class="ln">1987</span>                 $oSurvey-&gt;datestamp = '1980-01-01 00:00:01';
<span class="ln">1988</span>             } 
<span class="ln">1989</span>             //Check if startdate is set =&gt; throws no default error on importing
</pre></div>	</div>

	<div class="traces">
		<h2>Stack Trace</h2>
				<table style="width:100%;">
						<tbody><tr class="trace app expanded">
			<td class="number">
				#0			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/data/webdev/3LTS/application/controllers/admin/dataentry.php(146): <strong>CSVImportResponses</strong>("/data/webdev/3LTS/tmp/wsk4tn5fcf4mngcpxwv7",
 "629533", array("bDeleteFistLine" =&gt; true, "sExistingId" =&gt; 
"ignore", "bNotFinalized" =&gt; false, "bForceImport" =&gt; false, ...))
				</div>

				<div class="code"><pre><span class="ln">141</span>         }
<span class="ln">142</span>         $aOptions['bNotFinalized'] = (bool) Yii::app()-&gt;request-&gt;getPost('notfinalized');
<span class="ln">143</span>         $aOptions['bForceImport'] = (bool) Yii::app()-&gt;request-&gt;getPost('forceimport');
<span class="ln">144</span>         $aOptions['sCharset'] = Yii::app()-&gt;request-&gt;getPost('vvcharset');
<span class="ln">145</span>         $aOptions['sSeparator'] = "\t";
<span class="error"><span class="ln error-ln">146</span>         $aResult = CSVImportResponses($filePath, $iSurveyId, $aOptions);
</span><span class="ln">147</span>         unlink($filePath); //delete the uploaded file
<span class="ln">148</span>         $aData['class'] = "";
<span class="ln">149</span>         $aData['title'] = gT("Import a VV response data file");
<span class="ln">150</span>         $aData['aResult']['success'][] = gT("File upload succeeded.");
<span class="ln">151</span>         if (isset($aResult['success'])) {
</pre></div>			</td>
		</tr>
						<tr class="trace app expanded">
			<td class="number">
				#1			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/data/webdev/3LTS/application/controllers/admin/dataentry.php(96): <strong>dataentry</strong>-&gt;<strong>_handleFileUpload</strong>("629533",
 array("display" =&gt; array("menu_bars" =&gt; array("browse" =&gt; 
"Saisie de données")), "title_bar" =&gt; array("title" =&gt; "Saisie de 
données"), "sidemenu" =&gt; array("state" =&gt; false), "menu" =&gt; 
array("edition" =&gt; true, "import" =&gt; true, "close" =&gt; true), 
...))				</div>

				<div class="code"><pre><span class="ln">091</span> 
<span class="ln">092</span>                 $subAction = Yii::app()-&gt;request-&gt;getPost('subaction');
<span class="ln">093</span>                 if ($subAction != "upload") {
<span class="ln">094</span>                     $this-&gt;_showUploadForm($this-&gt;_getEncodingsArray(), $iSurveyId, $aData);
<span class="ln">095</span>                 } else {
<span class="error"><span class="ln error-ln">096</span>                     $this-&gt;_handleFileUpload($iSurveyId, $aData);
</span><span class="ln">097</span>                 }
<span class="ln">098</span>             } else {
<span class="ln">099</span>                 Yii::app()-&gt;session['flashmessage'] = gT("This survey is not active. You must activate the survey before attempting to import a VVexport file.");
<span class="ln">100</span>                 $this-&gt;getController()-&gt;redirect($this-&gt;getController()-&gt;createUrl("/admin/survey/sa/view/surveyid/{$iSurveyId}"));
<span class="ln">101</span>             }
</pre></div>			</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#2			</td>
			<td class="content">
				<div class="trace-file">
										&nbsp;unknown(0): <strong>dataentry</strong>-&gt;<strong>vvimport</strong>()				</div>

							</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#3			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/data/webdev/3LTS/framework/web/actions/CAction.php(115): <strong>ReflectionMethod</strong>-&gt;<strong>invokeArgs</strong>(dataentry, array())				</div>

				<div class="code"><pre><span class="ln">110</span>             elseif($param-&gt;isDefaultValueAvailable())
<span class="ln">111</span>                 $ps[]=$param-&gt;getDefaultValue();
<span class="ln">112</span>             else
<span class="ln">113</span>                 return false;
<span class="ln">114</span>         }
<span class="error"><span class="ln error-ln">115</span>         $method-&gt;invokeArgs($object,$ps);
</span><span class="ln">116</span>         return true;
<span class="ln">117</span>     }
<span class="ln">118</span> }
</pre></div>			</td>
		</tr>
						<tr class="trace app expanded">
			<td class="number">
				#4			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/data/webdev/3LTS/application/core/Survey_Common_Action.php(83): <strong>CAction</strong>-&gt;<strong>runWithParamsInternal</strong>(dataentry,
 ReflectionMethod, array("r" =&gt; 
"admin/dataentry/sa/vvimport/surveyid/629533", "sa" =&gt; "vvimport", 
"surveyid" =&gt; "629533", "iSurveyId" =&gt; "629533", ...))				</div>

				<div class="code"><pre><span class="ln">78</span>             $oMethod = new ReflectionMethod($this, $sDefault);
<span class="ln">79</span>         }
<span class="ln">80</span> 
<span class="ln">81</span>         // We're all good to go, let's execute it
<span class="ln">82</span>         // runWithParamsInternal would automatically get the parameters of the method and populate them as required with the params
<span class="error"><span class="ln error-ln">83</span>         return parent::runWithParamsInternal($this, $oMethod, $params);
</span><span class="ln">84</span>     }
<span class="ln">85</span> 
<span class="ln">86</span>     /**
<span class="ln">87</span>      * Some functions have different parameters, which are just an alias of the
<span class="ln">88</span>      * usual parameters we're getting in the url. This function just populates
</pre></div>			</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#5			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/data/webdev/3LTS/framework/web/CController.php(308): <strong>Survey_Common_Action</strong>-&gt;<strong>runWithParams</strong>(array("r"
 =&gt; "admin/dataentry/sa/vvimport/surveyid/629533", "sa" =&gt; 
"vvimport", "surveyid" =&gt; "629533", "iSurveyId" =&gt; "629533", ...))
				</div>

				<div class="code"><pre><span class="ln">303</span>     {
<span class="ln">304</span>         $priorAction=$this-&gt;_action;
<span class="ln">305</span>         $this-&gt;_action=$action;
<span class="ln">306</span>         if($this-&gt;beforeAction($action))
<span class="ln">307</span>         {
<span class="error"><span class="ln error-ln">308</span>             if($action-&gt;runWithParams($this-&gt;getActionParams())===false)
</span><span class="ln">309</span>                 $this-&gt;invalidActionParams($action);
<span class="ln">310</span>             else
<span class="ln">311</span>                 $this-&gt;afterAction($action);
<span class="ln">312</span>         }
<span class="ln">313</span>         $this-&gt;_action=$priorAction;
</pre></div>			</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#6			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/data/webdev/3LTS/framework/web/CController.php(286): <strong>CController</strong>-&gt;<strong>runAction</strong>(dataentry)				</div>

				<div class="code"><pre><span class="ln">281</span>      * @see runAction
<span class="ln">282</span>      */
<span class="ln">283</span>     public function runActionWithFilters($action,$filters)
<span class="ln">284</span>     {
<span class="ln">285</span>         if(empty($filters))
<span class="error"><span class="ln error-ln">286</span>             $this-&gt;runAction($action);
</span><span class="ln">287</span>         else
<span class="ln">288</span>         {
<span class="ln">289</span>             $priorAction=$this-&gt;_action;
<span class="ln">290</span>             $this-&gt;_action=$action;
<span class="ln">291</span>             CFilterChain::create($this,$action,$filters)-&gt;run();
</pre></div>			</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#7			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/data/webdev/3LTS/framework/web/CController.php(265): <strong>CController</strong>-&gt;<strong>runActionWithFilters</strong>(dataentry, array())				</div>

				<div class="code"><pre><span class="ln">260</span>         {
<span class="ln">261</span>             if(($parent=$this-&gt;getModule())===null)
<span class="ln">262</span>                 $parent=Yii::app();
<span class="ln">263</span>             if($parent-&gt;beforeControllerAction($this,$action))
<span class="ln">264</span>             {
<span class="error"><span class="ln error-ln">265</span>                 $this-&gt;runActionWithFilters($action,$this-&gt;filters());
</span><span class="ln">266</span>                 $parent-&gt;afterControllerAction($this,$action);
<span class="ln">267</span>             }
<span class="ln">268</span>         }
<span class="ln">269</span>         else
<span class="ln">270</span>             $this-&gt;missingAction($actionID);
</pre></div>			</td>
		</tr>
						<tr class="trace app collapsed">
			<td class="number">
				#8			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/data/webdev/3LTS/application/controllers/AdminController.php(165): <strong>CController</strong>-&gt;<strong>run</strong>("dataentry")				</div>

				<div class="code"><pre><span class="ln">160</span>                     $this-&gt;redirect(array('/admin/authentication/sa/login'));
<span class="ln">161</span>                 }
<span class="ln">162</span>             }
<span class="ln">163</span>         }
<span class="ln">164</span> 
<span class="error"><span class="ln error-ln">165</span>         return parent::run($action);
</span><span class="ln">166</span>     }
<span class="ln">167</span> 
<span class="ln">168</span>     /**
<span class="ln">169</span>      * Routes all the actions to their respective places
<span class="ln">170</span>      *
</pre></div>			</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#9			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/data/webdev/3LTS/framework/web/CWebApplication.php(282): <strong>AdminController</strong>-&gt;<strong>run</strong>("dataentry")				</div>

				<div class="code"><pre><span class="ln">277</span>         {
<span class="ln">278</span>             list($controller,$actionID)=$ca;
<span class="ln">279</span>             $oldController=$this-&gt;_controller;
<span class="ln">280</span>             $this-&gt;_controller=$controller;
<span class="ln">281</span>             $controller-&gt;init();
<span class="error"><span class="ln error-ln">282</span>             $controller-&gt;run($actionID);
</span><span class="ln">283</span>             $this-&gt;_controller=$oldController;
<span class="ln">284</span>         }
<span class="ln">285</span>         else
<span class="ln">286</span>             throw new CHttpException(404,Yii::t('yii','Unable to resolve the request "{route}".',
<span class="ln">287</span>                 array('{route}'=&gt;$route===''?$this-&gt;defaultController:$route)));
</pre></div>			</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#10			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/data/webdev/3LTS/framework/web/CWebApplication.php(141): <strong>CWebApplication</strong>-&gt;<strong>runController</strong>("admin/dataentry/sa/vvimport/surveyid/629533")				</div>

				<div class="code"><pre><span class="ln">136</span>             foreach(array_splice($this-&gt;catchAllRequest,1) as $name=&gt;$value)
<span class="ln">137</span>                 $_GET[$name]=$value;
<span class="ln">138</span>         }
<span class="ln">139</span>         else
<span class="ln">140</span>             $route=$this-&gt;getUrlManager()-&gt;parseUrl($this-&gt;getRequest());
<span class="error"><span class="ln error-ln">141</span>         $this-&gt;runController($route);
</span><span class="ln">142</span>     }
<span class="ln">143</span> 
<span class="ln">144</span>     /**
<span class="ln">145</span>      * Registers the core application components.
<span class="ln">146</span>      * This method overrides the parent implementation by registering additional core components.
</pre></div>			</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#11			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/data/webdev/3LTS/framework/base/CApplication.php(185): <strong>CWebApplication</strong>-&gt;<strong>processRequest</strong>()				</div>

				<div class="code"><pre><span class="ln">180</span>     public function run()
<span class="ln">181</span>     {
<span class="ln">182</span>         if($this-&gt;hasEventHandler('onBeginRequest'))
<span class="ln">183</span>             $this-&gt;onBeginRequest(new CEvent($this));
<span class="ln">184</span>         register_shutdown_function(array($this,'end'),0,false);
<span class="error"><span class="ln error-ln">185</span>         $this-&gt;processRequest();
</span><span class="ln">186</span>         if($this-&gt;hasEventHandler('onEndRequest'))
<span class="ln">187</span>             $this-&gt;onEndRequest(new CEvent($this));
<span class="ln">188</span>     }
<span class="ln">189</span> 
<span class="ln">190</span>     /**
</pre></div>			</td>
		</tr>
						<tr class="trace app collapsed">
			<td class="number">
				#12			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/data/webdev/3LTS/index.php(193): <strong>CApplication</strong>-&gt;<strong>run</strong>()				</div>

				<div class="code"><pre><span class="ln">188</span> require_once APPPATH . 'core/LSYii_Application' . EXT;
<span class="ln">189</span> 
<span class="ln">190</span> $config = require_once(APPPATH . 'config/internal' . EXT);
<span class="ln">191</span> 
<span class="ln">192</span> Yii::$enableIncludePath = false;
<span class="error"><span class="ln error-ln">193</span> Yii::createApplication('LSYii_Application', $config)-&gt;run();
</span><span class="ln">194</span> 
<span class="ln">195</span> /* End of file index.php */
<span class="ln">196</span> /* Location: ./index.php */
</pre></div>			</td>
		</tr>
				</tbody></table>
	</div>

	<div class="version">
		2021-10-25 12:27:22 nginx/1.18.0 <a href="http://www.yiiframework.com/">Yii Framework</a>/1.1.24-dev	</div>
</div>

<script type="text/javascript">
/*<![CDATA[*/
var traceReg = new RegExp("(^|\\s)trace-file(\\s|$)");
var collapsedReg = new RegExp("(^|\\s)collapsed(\\s|$)");

var e = document.getElementsByTagName("div");
for(var j=0,len=e.length;j<len;j++){
	if(traceReg.test(e[j].className)){
		e[j].onclick = function(){
			var trace = this.parentNode.parentNode;
			if(collapsedReg.test(trace.className))
				trace.className = trace.className.replace("collapsed", "expanded");
			else
				trace.className = trace.className.replace("expanded", "collapsed");
		}
	}
}
/*]]>*/
</script>




<table class="yiiLog" style="border-spacing:1px;font:11px Verdana, Arial, Helvetica, sans-serif;background:#EEEEEE;color:#666666;" width="100%" cellpadding="2">
	<tbody><tr>
		<th style="background:black;color:white;" colspan="5">
			Journal d'application
		</th>
	</tr>
	<tr style="background-color: #ccc;">
	    <th style="width:120px">Heure</th>
		<th>Niveau</th>
		<th>Categorie</th>
		<th>Message</th>
	</tr>
	<tr style="background:#FFC0CB">
		<td align="center">12:27:22.394759</td>
		<td>error</td>
		<td>application.LimeExpressionManager</td>
		<td><pre>setVariableAndTokenMappingsForExpressionManager with an empty
surveyOptions.</pre></td>
	</tr>	<tr style="background:#FFC0CB">
		<td align="center">12:27:22.455497</td>
		<td>error</td>
		<td>php</td>
		<td><pre>Undefined offset: 1
(/data/webdev/3LTS/application/helpers/admin/import_helper.php:1977)
Stack trace:
#0 unknown(0): dataentry-&gt;vvimport()
#1 /data/webdev/3LTS/framework/web/actions/CAction.php(115):
ReflectionMethod-&gt;invokeArgs()
#2 /data/webdev/3LTS/application/core/Survey_Common_Action.php(83):
dataentry-&gt;runWithParamsInternal()
#3 /data/webdev/3LTS/framework/web/CController.php(308):
dataentry-&gt;runWithParams()
#4 /data/webdev/3LTS/framework/web/CController.php(286):
AdminController-&gt;runAction()
#5 /data/webdev/3LTS/framework/web/CController.php(265):
AdminController-&gt;runActionWithFilters()
#6 /data/webdev/3LTS/application/controllers/AdminController.php(165):
AdminController-&gt;run()
#7 /data/webdev/3LTS/framework/web/CWebApplication.php(282):
AdminController-&gt;run()
#8 /data/webdev/3LTS/framework/web/CWebApplication.php(141):
LSYii_Application-&gt;runController()
#9 /data/webdev/3LTS/framework/base/CApplication.php(185):
LSYii_Application-&gt;processRequest()
#10 /data/webdev/3LTS/index.php(193): LSYii_Application-&gt;run()
REQUEST_URI=/3LTS/index.php?r=admin/dataentry/sa/vvimport/surveyid/629533</pre></td>
	</tr></tbody></table>
<!-- end of log messages --><div id="grammalecte_menu_main_button_shadow_host" style="width: 0px; height: 0px;"></div></body><script src="PHP%20notice%20-Value_fichiers/api.js"></script></html>
<!-- start log messages -->
PHP notice -Value.html (23,285 bytes)   
DenisChenu

DenisChenu

2021-10-25 12:42

developer   ~66926

Last edited: 2021-12-13 18:38

result of vvexport_629533_valueLineFeed.csv without dbug

DenisChenu

DenisChenu

2021-10-26 17:02

developer   ~66938

Last edited: 2021-12-13 18:38

@c_schmitz : if this feature can be OK in dev/master or 3.X : i take it and fix it.

iconv is already needed for TSV and excel export
https://github.com/LimeSurvey/LimeSurvey/blob/3f4149116d4409055f4085b78680e43ce5d841e2/application/helpers/admin/import_helper.php#L2683

Just need to know :)

c_schmitz

c_schmitz

2021-10-26 17:55

administrator   ~66945

Last edited: 2021-12-13 18:38

Sounds good to me.

DenisChenu

DenisChenu

2021-10-26 18:57

developer   ~66948

Last edited: 2021-12-13 18:38

Thanks :)

DenisChenu

DenisChenu

2021-12-04 11:24

developer   ~67676

Last edited: 2021-12-13 18:38

OK :) Get the contract !

DenisChenu

DenisChenu

2021-12-10 10:48

developer   ~67756

Last edited: 2021-12-13 18:38

https://github.com/LimeSurvey/LimeSurvey/pull/2177

DenisChenu

DenisChenu

2022-01-12 15:00

developer   ~67972

PS : contract broken : Excel don't know how to use CSV with Line feed .
Pull request still valid for LibreOO user :)

DenisChenu

DenisChenu

2022-02-21 12:46

developer   ~68339

Fix committed to 3.x-LTS branch: http://bugs.limesurvey.org/plugin.php?page=Source/view&amp;id=33222

LimeBot

LimeBot

2022-02-28 13:00

administrator   ~68434

Fixed in Release 3.28.1+220229

guest

guest

2022-03-08 08:57

viewer   ~68566

Fix committed to master branch: http://bugs.limesurvey.org/plugin.php?page=Source/view&amp;id=33332

Related Changesets

LimeSurvey: 3.x-LTS 3197b7eb

2022-02-21 12:46:19

DenisChenu


Committer: GitHub Details Diff
Fixed issue 17677: Valid TSV file can not be used in VV import (#2177)

* Fixed issue 17677: Valid TSV file can not be used in VV import
Dev: allow line feed, checked with latin1 file too.

* Dev: phpdoc typo
Affected Issues
17677
mod - application/helpers/admin/import_helper.php Diff File

LimeSurvey: master 002ebc5c

2022-03-08 08:57:40

user81814


Committer: GitHub Details Diff
Fixed issue 17677: Valid TSV file can not be used in VV import (#2273)

Dev: allow line feed, checked with latin1 file too.
Affected Issues
17677
mod - application/controllers/admin/DataEntry.php Diff File
mod - application/helpers/admin/import_helper.php Diff File

Issue History

Date Modified Username Field Change
2021-10-25 12:31 DenisChenu New Issue
2021-10-25 12:32 DenisChenu Note Added: 66924
2021-10-25 12:32 DenisChenu File Added: vvexport_629533_headerLineFeed.csv
2021-10-25 12:32 DenisChenu File Added: vvexport_629533_valueLineFeed.csv
2021-10-25 12:32 DenisChenu File Added: PHP notice -Value.html
2021-10-25 12:32 DenisChenu File Added: survey_archive_629533.lsa
2021-10-25 12:32 DenisChenu Bug heat 0 => 2
2021-10-25 12:42 DenisChenu Note Added: 66926
2021-10-25 12:42 DenisChenu File Added: Capture d’écran du 2021-10-25 12-42-08.png
2021-10-25 12:55 DenisChenu Relationship added parent of 17678
2021-10-26 17:02 DenisChenu Note Added: 66938
2021-10-26 17:55 c_schmitz Note Added: 66945
2021-10-26 17:55 c_schmitz Bug heat 2 => 4
2021-10-26 18:57 DenisChenu Note Added: 66948
2021-10-26 18:57 DenisChenu Assigned To => DenisChenu
2021-10-26 18:57 DenisChenu Status new => assigned
2021-11-02 09:58 galads Zoho Project Synchronization => |Yes|
2021-12-04 11:24 DenisChenu Note Added: 67676
2021-12-10 10:01 DenisChenu Project Feature requests => Bug reports
2021-12-10 10:02 DenisChenu Summary Allow line feed in VV import => Valid TSV file can not be used in VV import
2021-12-10 10:02 DenisChenu Complete LimeSurvey version number (& build) => 3.27.25
2021-12-10 10:02 DenisChenu Browser => not relevant
2021-12-10 10:02 DenisChenu Database type & version => not relevant
2021-12-10 10:02 DenisChenu Server OS (if known) => not relevant
2021-12-10 10:02 DenisChenu Webserver software & version (if known) => nginx
2021-12-10 10:02 DenisChenu PHP Version => 7.4
2021-12-10 10:02 DenisChenu Zoho Project Synchronization Yes => |Yes|
2021-12-10 10:48 DenisChenu Note Added: 67756
2021-12-13 18:38 DenisChenu Assigned To DenisChenu => galads
2021-12-13 18:38 DenisChenu Status assigned => ready for testing
2022-01-12 15:00 DenisChenu Note Added: 67972
2022-02-21 12:46 DenisChenu Changeset attached => LimeSurvey 3.x-LTS 3197b7eb
2022-02-21 12:46 DenisChenu Note Added: 68339
2022-02-21 12:46 DenisChenu Assigned To galads => DenisChenu
2022-02-21 12:46 DenisChenu Resolution open => fixed
2022-02-28 13:00 LimeBot Zoho Project Synchronization Yes => |Yes|
2022-02-28 13:00 LimeBot Note Added: 68434
2022-02-28 13:00 LimeBot Status ready for testing => closed
2022-02-28 13:00 LimeBot Bug heat 4 => 6
2022-03-08 08:57 user81814 Changeset attached => LimeSurvey master 002ebc5c
2022-03-08 08:57 guest Note Added: 68566
2022-03-08 08:57 guest Bug heat 6 => 8