在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中另存为宏

Excel VBA 使用单元格文本作为文件名在当前目录中另存为

打印时更改 PDF 文件名 - 另存为操作

VB.Net 为 word 5.5 .DOC 扫描文件夹和子文件夹并在不同文件夹中另存为 RTF

在 MS Word 2010 中另存为的键盘快捷键