在javascript中另存为csv文件
Posted
技术标签:
【中文标题】在javascript中另存为csv文件【英文标题】:Save as csv file in javascript 【发布时间】:2017-11-17 20:41:45 【问题描述】:我仍然是 javascript 的初学者并且仍在训练,我编写了一个计算日出、日落、中午和午夜时间的代码。
借助 *** 中的许多主题,我可以解决任何问题(即使它不专业)。
我可以使用document.write()
或console.log()
来使用我的结果。
我会知道,如何将我的结果保存为 csv 文件,而不是使用 document.write()
显示我的结果
我显示的结果已经是csv格式了:
01/01/yyyy,06:00:00,12:00:00,18:00:00,00:00:00 ...... 31/12/yyyy,06:00:00,12:00:00,18:00:00,00:00:00
结论:如何将我的结果保存为csv文件,请解释一下。
html:
<!DOCTYPE html> <html>
<head>
<title>Sunrise and Sunset</title>
</head>
<body>
<form>
Latitude: <input id='lat' value='52.0'>
<br>
Longitude: <input id='lon' value='10.0'>
<br>
Elevation: <input id='elv' value='0.0'>
<br><br>
Year: <input id='yr' value='2000'>
<br>
Time zone: <input id='tz' value='1.0'>
<br>
<button id='btn' onclick='rechner();'>
Get your data
</button>
</body> </html>
Javascript:
//-------Degrees to radians------//
function toRad(angle)
return angle*Math.PI/180;
;
//------Radians to degrees-------//
function toDeg(angle)
return angle*180/Math.PI;
;
//---------Main function-------//
function rechner()
var lat,lon,elv,year,tzone;
lat = parseFloat(document.getElementById('lat').value);
lon = parseFloat(document.getElementById('lon').value);
elv = parseFloat(document.getElementById('elv').value);
year = parseInt(document.getElementById('yr').value);
tzone = parseFloat(document.getElementById('tz').value);
var dip_angle = 0.0347*Math.sqrt(elv);
//dip angle for sunrise and sunset accounting for elevation of the location, it is here in degrees expressed
var date = new Date(year,0,1,12);
var time = date.getTime();
var julian_date = (time / 86400000) - (date.getTimezoneOffset()/1440) + 2440587.5;
var d = julian_date - 2451545.0;
var yr = date.getFullYear();
// get year from the date 01/01/YYYY
for(var i=0; i<=((yr%4)==0 ? 365 : 364); i++)
var D = d+i;
//------Solar approximate coordinates----//
var g = ((357.529 + 0.98560028*D)+360)%360;
//Mean anomaly of the Sun
var q = ((280.459 + 0.98564736*D)+360)%360;
//Mean longitude of the Sun
var L = ((q + 1.915*Math.sin(toRad(g)) + 0.020*Math.sin(toRad(2*g)))+360)%360;
//Geocentric apparent ecliptic longitude of the Sun (adjusted for aberration)
var e = 23.439 - 0.00000036*D;
//Mean obliquity of the ecliptic
var ra = ((toDeg(Math.atan2(Math.cos(toRad(e))*Math.sin(toRad(L)),Math.cos(toRad(L)))))+360)%360;
// Right ascension in deg
var dec = toDeg(Math.asin(Math.sin(toRad(e))*Math.sin(toRad(L))));
// Declination in deg
var eqt = (((q - ra)/15)+24)%24
//equation of time, in hrs
var R = 1.00014 - 0.01671*Math.cos(toRad(g)) - 0.00014*Math.cos(toRad(2*g));
// Distance Sun-Earth in AU
var SD = 0.2666/R;
// Semi-diameter of sun in degrees
//---function calculates timestamp from noon to the wanted angle under horizon--//
function timeTodip (angle)
return 1/15*toDeg(Math.acos((-Math.sin(toRad(angle))-Math.sin(toRad (lat))*Math.sin(toRad(dec)))/(Math.cos(toRad(lat))*Math.cos(toRad(dec)))));
;
//function renders hh.hhh in range [0,24]
function rendHr(y)
if(y>=0 && y<=24)return y;
else if(y>24)return y%24;
elsereturn y%24 + 24
;
//---function converts hh.hhhh to hh:mm:ss
function hhToHMS(nbr)
var decimalTimeString = nbr;
var n = new Date(0,0);
n.setSeconds(+decimalTimeString * 60 * 60);
return n.toTimeString().slice(0, 8)
;
//---function gets date as DD/MM/YYYY---//
function convertDate(inputFormat)
function pad(s) return (s < 10) ? '0' + s : s;
var z = new Date(inputFormat);
return [pad(z.getDate()), pad(z.getMonth()+1), z.getFullYear()].join('/');
;
var noon = rendHr(12 + tzone - lon/15 - eqt); //noon time in format hh.hhhh
//--------Sunrise and sunset calc--------//
var sunrise = noon - timeTodip(0.833+dip_angle); //sunrise
var sunset = noon + timeTodip(0.833+dip_angle); //sunset
var mid = (24-rendHr(sunset-sunrise))/2 + sunset; //solar midnight
var nbrDay= new Date((10957+(julian_date - 2451545.0)+i)*86400000);
document.write(convertDate(nbrDay)+','+hhToHMS(sunrise)+','+hhToHMS(noon)+','+hhToHMS(sunset)+','+hhToHMS(mid)+'<br>');
;
;
感谢您的帮助
编辑: Jsfiddle
js linter says it's good
【问题讨论】:
初学者永远不要使用document.write()
您的意思是,如何将其作为可下载文件呈现给客户端?或如何将其保存到您的服务器。
客户端应该点击例如一个按钮,然后将其下载为 csv,而不是显示在浏览器中
【参考方案1】:
在文档的某处包含这个方便的“saveAs”功能。
function saveAs(text, filename)
var pom = document.createElement('a');
pom.setAttribute('href', 'data:text/plain;charset=urf-8,'+encodeURIComponent(text));
pom.setAttribute('download', filename);
pom.click();
;
然后使用它:
saveAs(myCSVString, "data.csv");
【讨论】:
函数 saveAs(text,filename) 是否应该在我的函数中,直到它保存由 for 循环生成的整个数据列表?并直接写 document.write() 而不是 myCSVString 之间的内容? 把这个函数放在哪里取决于你。如果你想在你当前的rechner
函数中定义它,你可以。如果您担心污染全局范围,那么这将是可取的。但是,如果您可能希望在应用程序的另一部分重用此函数,那么将其放在您的 rechner
函数之外以便全局访问可能更可取。
您有许多与此问题或提供的函数无关的 javascript 错误。请通过 linter 运行您的 javascript。
我在 dcoder 应用程序中正常运行没有问题的代码,并通过 linter 对其进行了测试……一切正常……结果符合预期……只是我想将结果保存为 csv 文件而不是在网页中显示...我添加了一个用于 jslinter 验证的屏幕截图链接
那个小提琴的代码不行。存在需要清理的 JavaScript 错误。以上是关于在javascript中另存为csv文件的主要内容,如果未能解决你的问题,请参考以下文章
PySpark:将临时视图转换为表格并在本地驱动器中另存为 .CSV
Excel VBA 使用单元格文本作为文件名在当前目录中另存为