Javascript 使用日期解析在csv中读取

Javascript 使用日期解析在csv中读取,javascript,date,csv,d3.js,Javascript,Date,Csv,D3.js,很难正确加载数据。以下是包含第一个内容行的标题行: BookingID,Type,Status,Unit Booked,Unit Owner,Destination,Booking Date,Checkin,Checkout,Renter - FirstName,Renter - LastName,Renter - EmailAddress,Renter - WorkPhone,Renter - HomePhone,#Adults,#Children,Total Stay,Total Paid,

很难正确加载数据。以下是包含第一个内容行的标题行:

BookingID,Type,Status,Unit Booked,Unit Owner,Destination,Booking Date,Checkin,Checkout,Renter - FirstName,Renter - LastName,Renter - EmailAddress,Renter - WorkPhone,Renter - HomePhone,#Adults,#Children,Total Stay,Total Paid,Total Due
15642889,House,Confirmed,GV T3 #2106,,,3/20/2016 7:00:00 PM,3/23/2016 3:00:00 PM,3/28/2016 11:00:00 AM,FirstName,LastName,first&last@gmail.com,+1 (000) 000-0000,+1 (000) 000-0000,2,0,895,895,0
以及根据需要加载和解析我的csv的相关行:

var parseDate = d3.time.format("%m/%d/%Y %H:%M:%S %p").parse;
var data = d3.csv("Sales Export Friendly 3-19-17.csv", function(data) {
    return {
        unit: data["Unit Booked"],
        date: parseDate(data["Booking Date"]).getMonth() + 1,
        checkin: parseDate(data["Checkin"]).getMonth() + 1,
        LOS: parseDate(data["Checkout"]).valueOf() - parseDate(data["Checkin"]).valueOf()/(24*60*60*1000),
        total: +data["Total Stay"],
        avgNight: (+data["Total Stay"]) / ((new Date(data["Checkout"]).valueOf() - new Date(data["Checkin"]).valueOf())/(24*60*60*1000))
        };
});
我的想法是这样做:

d3.parcoords()("#TopLeft").alpha(0.4)
        .data(data)
        .dimensions(data.columns)
如果我尝试console.log(data.columns);在我的回调函数之后,我得到了未定义的。这里是console.log(数据);照片,看起来很奇怪:

Object { header: Cn/u.header(), mimeType: Cn/u.mimeType(), responseType: Cn/u.responseType(), response: Cn/u.response(), get: Cn/</u[n](), post: Cn/</u[n](), send: Cn/u.send(), abort: Cn/u.abort(), on: M/<(), row: e/o.row() }
调用d3.parcoords上的数据(data)时,以及

TypeError: e is undefined
在这一行:

checkin: parseDate(data["Checkin"]).getMonth() + 1,

我对这里出了什么问题感到非常困惑。我使用的是D3V3。编辑:我错了。回调是每行的。然而,在最新版本的d3中,数据确实是异步加载的。我很难找到正确的方法来使用这个函数,但我找到了解决办法。d3.csv现在返回一个承诺。要使用解析的数据,请将doSomething传递给
promise.then()

原始注释,用于上下文:

CSV文件是异步加载的,因此设置 data=d3.csv(路径,回调)没有什么意义。当你申报 回调,这是事情必须发生的地方。回调可以引用 全局变量,或者只使用局部变量并将结果传递给 下一阶段。根据代码判断,您希望输出一个对象 用于保存存储在其下的筛选/后处理列 各自的钥匙

此外,我怀疑时间解析方法是否可以应用于数组。 为此,您可能必须使用array.map

我建议这样做(未经测试):

var parseDate=d3.time.format(“%m/%d/%Y%H:%m:%S%p”).parse;
d3.csv(“销售出口友好型3-19-17.csv”),功能(数据){
//请注意,数据在此函数作用域中是本地的
让已筛选的_数据={
单位:数据[“记账单位”],
日期:数据[“预订日期”].map(s=>parseDate().getMonth()+1),
签入:数据[“签入”].map(s=>parseDate().getMonth()+1),
总计:数据[“总停留时间”]。地图(s=>+s),
};
过滤的_data.LOS=[];
过滤的_data.avgNight=[];
设N=数据[“签出”]。长度;
for(设i=0;i

编辑:我错了。回调是每行的。然而,在最新版本的d3中,数据确实是异步加载的。我很难找到正确的方法来使用这个函数,但我找到了解决办法。d3.csv现在返回一个承诺。要使用解析的数据,请将doSomething传递给
promise.then()

原始注释,用于上下文:

CSV文件是异步加载的,因此设置 data=d3.csv(路径,回调)没有什么意义。当你申报 回调,这是事情必须发生的地方。回调可以引用 全局变量,或者只使用局部变量并将结果传递给 下一阶段。根据代码判断,您希望输出一个对象 用于保存存储在其下的筛选/后处理列 各自的钥匙

此外,我怀疑时间解析方法是否可以应用于数组。 为此,您可能必须使用array.map

我建议这样做(未经测试):

var parseDate=d3.time.format(“%m/%d/%Y%H:%m:%S%p”).parse;
d3.csv(“销售出口友好型3-19-17.csv”),功能(数据){
//请注意,数据在此函数作用域中是本地的
让已筛选的_数据={
单位:数据[“记账单位”],
日期:数据[“预订日期”].map(s=>parseDate().getMonth()+1),
签入:数据[“签入”].map(s=>parseDate().getMonth()+1),
总计:数据[“总停留时间”]。地图(s=>+s),
};
过滤的_data.LOS=[];
过滤的_data.avgNight=[];
设N=数据[“签出”]。长度;
for(设i=0;i

我没有使用D3的csv解析器(尽管我使用D3的其他方式)。然而,如果您使用的是版本3,那么看起来您的数据结果实际上是作为完整数组,作为第二次回调,而不是返回结果。您定义的唯一回调是访问器。请参阅“我没有使用D3的csv解析器”(尽管我使用D3的情况不同)。然而,如果您使用的是版本3,那么看起来您的数据结果实际上是作为完整数组,作为第二次回调,而不是返回结果。您定义的唯一回调是访问器。看你是不是错了,这是正确的答案!问题的主要问题是未能正确处理异步加载。你一定要把上一次编辑的内容放回原处,只需要修改一下你原来的文章就行了。事实上,编辑是错误的,因为OP使用的v3没有返回承诺。再次强调,坚持你的第一篇文章并改进这个版本。@altocumulus谢谢你。我鼓励您编辑我的答案,因为您显然比我更了解这一点。:-)你没有错,这是正确的答案!问题的主要问题是未能正确处理异步加载。你一定要把上一次编辑的内容放回原处,只需要修改一下你原来的文章就行了。事实上,编辑是错误的,因为OP使用的v3没有返回承诺。再次强调,坚持你的第一篇文章并改进这个版本。@altocumulus谢谢你。我鼓励您编辑我的答案,因为您显然比我更了解这一点。:-)
checkin: parseDate(data["Checkin"]).getMonth() + 1,
var parseDate = d3.time.format("%m/%d/%Y %H:%M:%S %p").parse;
d3.csv("Sales Export Friendly 3-19-17.csv", function(data) {
    //Note that data is a local in this function scope
    let filtered_data = {
        unit: data["Unit Booked"],
        date: data["Booking Date"].map(s=>parseDate().getMonth()+1),
        checkin: data["Checkin"].map(s=>parseDate().getMonth()+1),
        total: data["Total Stay"].map(s=>+s),
    };

    filtered_data.LOS = [];
    filtered_data.avgNight = [];
    let N = data["Checkout"].length;
    for (let i=0; i < N; i++) {
        filtered_data.LOS[i] = parseDate(data["Checkout"][i]).valueOf() -parseDate(data["Checkin"][i]).valueOf()/(24*60*60*1000),
        filtered_data.avgNight[i] = (+data["Total Stay"][i])/filtered_data.LOS[i];
    }
    doSomething(filtered_data);
});