2012-02-14 27 views
7

Tôi có tệp văn bản nằm trên máy chủ chứa danh sách các sự kiện có thời gian đích của chúng. Nó trông giống như sau:Đọc tệp văn bản thành các biến có javascript

2012/02/11-10:00:00 EventStart Red 
2012/02/11-10:10:00 EventStop Green 
... 

Những gì tôi cần làm là bằng cách nào đó đọc tệp văn bản và dựa trên thời gian hiện tại chọn sự kiện sắp tới tiếp theo và gán từng phần tử cho sự kiện đó cho biến. Vì vậy, ví dụ: nếu thời gian hiện tại là 2012.02.11-10: 08: 00, các biến javascript time = '2012/02/11-10:10:00'; title = 'EventStop'; color = 'Green'; sẽ được tạo.

Tôi có thể đọc các tập tin văn bản với:

jQuery.get('schedule.txt',function(data){ 
    alert(data); 
}); 

Chỉ cần không biết đi đâu từ đó, hoặc nếu đó là ngay cả những cách tốt nhất để bắt đầu. Tôi có quyền kiểm soát định dạng của tệp văn bản, do đó, sửa đổi đó là một tùy chọn.

+5

Nó trông giống như một cái gì đó nên được thực hiện trên máy chủ , không phải trên máy khách. – gdoron

+0

@gdoron Đồng ý. – rcdmk

+0

@gdoron Tôi đồng ý, tuy nhiên trong trường hợp cụ thể này, nó cần phải được thực hiện trên máy khách. – codybuell

Trả lời

9

Bạn nói bạn có thể sửa đổi nội dung của tệp, vì vậy tôi đề nghị chuyển đổi thành JSON (và tách ngày/giờ).

[{"date": "2012/02/11", "time": "10:00:00", "title": "EventStart", "color": "Red"}, {"date": "2012/02/11", "time": "10:10:00", "title": "EventStop", "color": "Green"}] 

Sau đó, bạn có thể sử dụng getJSON để nhận/phân tích cú pháp.

jQuery.getJSON('schedule.txt',function(data){ 
    // data is an array of objects 
    $.each(data, function(){ 
     console.log(this.title); // log each title 
    }); 
}); 

Từ đây, bạn có thể đọc thời gian và tìm ra cái nào mới nhất. Một cái gì đó như thế này nên làm việc:

if(Date.now() <= Date.parse(this.date+' '+this.time)) 

Vì vậy, đặt nó tất cả cùng nhau:

jQuery.getJSON('schedule.txt',function(data){ 
    var matchedSchedule = {}; 
    // data is an array of objects 
    $.each(data, function(){ 
     if(Date.now() <= Date.parse(this.date+' '+this.time)){ 
      matchedSchedule = this; // If time matches, set a variable to this object 
      return false; // break the loop 
     } 
    }); 
    console.log(matchedSchedule.title); 
    // to set a "global" variable, add it to `window` 
    window.eventTitle = matchedSchedule.title; 
}); 
+1

Tuyệt vời. Định dạng lại tệp văn bản thành JSON như được đề xuất và có thể chạy tập lệnh ở trên. Tuy nhiên tôi không nhận được phần cuối cùng. Vì vậy, làm thế nào tôi có thể dừng lại trên trận đấu đầu tiên (vì lợi ích đơn giản, thời gian hiện tại là ít hơn this.time) và gán một biến cho mỗi yếu tố (ngày, thời gian, tiêu đề, màu sắc)? – codybuell

+0

Nếu bạn 'trả về false;' trong hàm được truyền tới '$ .each', nó sẽ dừng vòng lặp. Nếu thời gian phù hợp, bạn có thể thiết lập các biến, và 'return false;'. –

+1

Điều đó đã làm các trick. Đã phải sử dụng jQuery.ajax với async thiết lập để sai thay vì jQuery.getJSON khác tôi không thể nhận được bất kỳ các biến đặt ra (thậm chí sử dụng window.varname ...). – codybuell

0

Có vẻ như bạn đã thực hiện phần khó khăn. Bây giờ chỉ phân tích dữ liệu được trả về.

jQuery.get('schedule.txt',function(data){ 
    yourParseFunction(data); 
}); 
+0

Phần khó khăn của anh ta là phân tích cú pháp dữ liệu ... – gdoron

+0

Vì vậy, với tuyến đường cụ thể này, làm thế nào tôi có thể tạo các biến toàn cầu từ hàm này? Khi tôi cố gọi các biến được tạo trong hàm đó, chúng không được định nghĩa. – codybuell

+0

hiện câu trả lời của @ Rocket có giúp hay bạn vẫn cần câu trả lời? –

5

Nếu không có thay đổi file văn bản của bạn

$.get('sometext.txt',function(data){ 
    var perLine=data.split('\n'); 
    var myVars=[]; 
    for(i=0;i<perLine.length;i++) 
    { 
    var line=perLine[i].split(' '); 
    myVars[i]={ 
     'time':line[0], 
     'event':line[1], 
     'color':line[2] 
     } 
    } 
    console.log(myVars); 
    console.log(myVars[0].time); 
    console.log(myVars[0].event); 
    console.log(myVars[0].color); 
}); 
Các vấn đề liên quan