Alarmlist maken

Status
Niet open voor verdere reacties.

peba25

Gebruiker
Lid geworden
6 jul 2009
Berichten
70
Voor een project wil ik graag een lijt maken welke de volgende opbouw heeft:
eventlist.JPG

De lijst wil ik vullen met data uit een csv file. De variabele die ik hierin weg schrijf zijn
nr,reden,datum,starttijd, stoptijd,duration,minimale waarde,maximale waarde

Nu is mijn vraag hoe kan ik het beste de csv file opbouwen zodat deze in javscript goed te parsen is? En hoe zou ik een lijst kunnen maken waarin ik de geparste data presenteer?

Heeft iemand hier suggesties voor?
Alvast bedankt voor de hulp.
 
hoe kan ik het beste de csv file opbouwen
Nou, als je de keuze hebt, is het geen csv file meer! Eh, in ieder geval, mocht je een formaat kunnen specificeren, kan je eens kijken naar JSON.


In principe maakt het niet uit. Zolang je maar een leesbaar formaat hebt (ascii).


Stukkie code. Stel, je 'csv' file ziet er zo uit (let op: versimpeld!):
Code:
eventNaam,time,max,min
eventNaam,time,max,min
..., ..., ..., ..., ...
dan krijg je:
HTML:
<table id='tabelding'></table>
[JS]function parseStuff(raw)
{
//raw = string met csv dus. Met een xmlhttprequest oid opgehaald.

raw = raw.replace('\r', ''); //haal \r weg, zodat we alleen maar naar \n hoeven te kijken.
var lines = [];

lines = raw.split('\n', '');

var i, l = lines.length;

for(i=0; i<l; i++)
{
var data = lines; //[eventNaam,time,max,min];

voegAanTabelToe(data);
}
}

function voegAanTabelToe(data)
{
var dezeRow = document.createElement('tr');

var evName = document.createElement('td');
evName.innerHTML = data[0];

//hetzelfde voor max, min, tijd, etcetera

document.getElementById('tabelding').appendChild(dezeRow);
}[/JS]zoiets.


In principe wertk het voor je nr,reden,datum,starttijd, stoptijd,duration,minimale waarde,maximale waarde precies hetzelfde. Zolang je kleine functies schrijft is alles nog leesbaar ook!
 
Laatst bewerkt:
Bedankt Vegras,

Duidelijk voorbeeld. Over Json.. Hoe bepaal ik de opbouw van het bestand?
kom ik hiermee uit de voeten...
{
"eventnr" : [var1],"lokatie" : [var2],"oorzaak" : [var3],"starttijd" : [var4],"waarde" : [var5],"stoptijd" : [var6],"starttijd" : [var7]
}

In javascript:
ophalen met XMLHttpRequest

parsen met
var json_events = eval( '(' + json_data + ')' );

dit geeft:
document.getElementById('evtnr').value = (json_events.eventnr[0])


Gaat dit goed?
 
Hier's een tip: gebruik JSONLint, een soort van JSON parser. Anyway:
Code:
{
    "eventnr" : [
        var1
    ],
    "lokatie" : [
        var2
    ],
    "oorzaak" : [
        var3
    ],
    "starttijd" : [
        var4
    ],
    "waarde" : [
        var5
    ],
    "stoptijd" : [
        var6
    ],
    "starttijd" : [
        var7
    ]
}
Kan, maar dan moet je voor elk item dus in alle items van je JSON kijken. JSON is redelijk vrij, dus je hoeft er niet echt arrays van te maken. Dit kan bijvoorbeeld ook:
Code:
{
    "items": [
        {
            "tijd": "6",
            "iets": "waarde2",
            "anders": "waarde3",
            "test": "waarde4",
            "xxx": "waarde5" 
        },
        {
            "tijd": "42",
            "iets": "waarde2",
            "anders": "waarde3",
            "test": "waarde4",
            "xxx": "waarde5" 
        } 
    ]
}
dan krijg je een mooie loop, nl:
[JS]for(item in geparsedeJSON.items)
{
alert(item.tijd); // 1e keer 6, 2e keer 42.
}[/JS]

Je moet maar even wat testen. Over de JSON syntax: zolang het correct door de JSONlint heenkomt zou t moeten werken.



:thumb:
 
Laatst bewerkt:
Ik heb toch eerst maar even je voorbeeld gebruikt om mbv de csv file de lijst te vullen.
Het resultaat is:
alarmlist2.JPG


Met de code:

HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional //EN"> 
<html>
<head>
	<link rel="stylesheet" type="text/css" href="main.css" />
<script>
var weeknumber = 24;

// load the specified url -synchronously- and return the response
function ajax(url) {
	if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera,
		// Safari
		req = new XMLHttpRequest();
	} else { // code for IE6, IE5
		req = new ActiveXObject("Microsoft.XMLHTTP");
	}
	req.open("GET", url, false);
	req.send(null);
	return req.responseText;
}

var myarray =[];

function parse() {
raw = ajax('../csvdata/'+ 'week' + weeknumber +'/freq_events.csv?' + new Date().getTime())
var raw = raw.split ('\r');
var j,l = raw.length -1;

for (j=0; j <l; j++) {
	var data = raw[j];
	var nummer = data.split(',');
	myarray[j]= nummer;
	
// creates a table row
    var row = document.createElement("tr");
			// colums
            for (var i = 0; i < 7; i++) {
                // Create a <td> element and a text node, make the text
                // node the contents of the <td>, and put the <td> at
                // the end of the table row
                var cell = document.createElement("td");
				
				var time = parseFloat (nummer[3]) * 1000;
				var myDate = new Date(time);//1276590251000
				nummer[3] =  (myDate.toUTCString());						
                var cellText = document.createTextNode(nummer[i]);
				
				
                cell.appendChild(cellText);
                row.appendChild(cell);
            }

            // add the row to the end of the table body
          document.getElementById('eventtable').appendChild(row);
		  
		var rows = document.getElementById('eventtable').getElementsByTagName ("tr");
		if (j % 2 == 0){
		rows[j].className = "even";
		}else{
		rows[j].className = "odd";
		}
	
        }
		        // sets the border attribute of tbl to 2;
        document.getElementById('eventtable').setAttribute("border", "1");
}
</script>

</head>

<body onload= "parse()" >
<div class="alarmlist">
<div class="eventheader2">
<table> 
<tr>
	<th style= "width: 60px">Event nr</th>
	<th style= "width: 10px">Phase</th>
	<th style= "width: 130px">Description</th>
	<th style= "width: 130px">Starttime</th>
	<th style= "width: 60px">Value</th>
	<th style= "width: 130px">Stoptime</th>
	<th style= "width: 60px">Value</th>
</tr>
</table>
</div>

<div class="eventtable2">
<table id="eventtable"> 
<tr>
	<th style= "width: 60px"></th>
	<th style= "width: 10px"></th>
	<th style= "width: 130px"></th>
	<th style= "width: 130px"></th>
	<th style= "width: 60px"></th>
	<th style= "width: 130px"></th>
	<th style= "width: 60px"></th>
</tr>

</table>
</div>
</div>
</body>

</html>

De volgende stap is om de unix timestamp naar leesbare datum om te zetten.
ik dacht zelf dat dit zou kunnen methet volgende probeersel:
[JS]
var time = parseFloat (nummer[3]) * 1000;
var myDate = new Date(time); //1276590251000
nummer[3] = (myDate.toUTCString());
[/JS]

Dit werkt echter niet.

Weet iemand wat hier verkeerd aan is?
 
Eerst wat algemene dingetjes:
[JS]var j,l = raw.length -1;[/JS]
als je nu loopt met for(j=0....) dan loop je 1x te weinig!

Wat ook raar is is dat je elke keer in je text-loop (7x dus) opnieuw de datum doet voor #3. Dit's natuurlijk niet zo efficient. Daarnaast veroorzaakt het je probleem denk ik: de 1e keer (van de 7) zit in nummer[3] namelijk je UNIX stamp, maar de 2e keer dus de geparsede string van Thu, 42 jan 1337 .....

maak eens van je totale loop zoiets:
[JS]
for (j=0; j<l; j++)
{
myarray[j] = raw[j].split(',');

var i, cell, cellText, row = document.createElement("tr");



// we know that [3] and [5] are unix timestamps and we want
// them to be pretty and all. So, make them pretty!

myarray[j][3] = new Date(parseInt(myarray[j][3]*10, 10)).toUTCString();
myarray[j][5] = new Date(parseInt(myarray[j][5]*10, 10)).toUTCString();



for(i=0; i<7; i++)
{
cell = document.createElement("td");
cellText = document.createTextNode(myarray[j]);

cell.appendChild(cellText);
row.appendChild(cell);
}



row.className = (j % 2 == 0) ? 'even' : 'odd';


/* this is shorthand for:

if(j % 2 == 0)
{
row.className = 'even';
}else{
row.className = 'odd';
}

we don't need the document.getElementById('') stuff, since we already have
pointer to the row... we created it ourselfs! :)

*/



var th = document.getElementById('eventtable');

th.appendChild(row);
th.setAttribute("border", "1"); // put this in the css?????
}
[/JS]:thumb:
 
Laatst bewerkt:
Bedankt Vegras,

Ziet er zo een stuk overzichtelijker uit!! Ik heb nu beschikking over iedere cell inhoud. Is het mogelijk om nu de tabel welke gecreerd is te sorteren op bijvoorbeeld datum?

Stel dat ik van de header text een href maak en een functie aanroep welke door de datums loopt, deze vervolgns sorteerd en de hele tabel opnieuw opbouwd...

Hoe zou ik zoiets kunnen realiseren?:)
 
Nou, je kan eerst alle data opslaan in een array... en deze steeds sorteren met een sort-functie... maar zoiets is een stuk makkelijker! :)
 
Nou, je kan eerst alle data opslaan in een array... en deze steeds sorteren met een sort-functie... maar zoiets is een stuk makkelijker! :)

Ha ha ja google komt ook hier weer goed van pas...
Ik had alreeds wat gevonden; http://yoast.com/articles/sortable-table/#download bijvoorbeeld. Werkt mooi als ik een table maak in html maar icm de bovenstaande code krijg ik het nog niet werkend.... Ook niet als ik

Code:
for (j=0; j< 50; j++)
{

for(i=0; i<1; i++)
   {
      cell     = document.createElement("td");
      cellText = document.createTextNode(myarray[j][i]);
                
      cell.appendChild(cellText);
      row.appendChild(cell);
   }

etc..



nog maar even verder googlen...

:D
 
Zelf heb ik goede ervaringen met deze hier. Heel simpel: javascript file toevoegen, en een 'sortable' class aan je table geven.


Het kan overgens zo zijn dat het niet werkt omdat je je tabel dynamisch maakt, maar dat zul je maar even moeten testen.
 
Zelf heb ik goede ervaringen met deze hier. Heel simpel: javascript file toevoegen, en een 'sortable' class aan je table geven.


Het kan overgens zo zijn dat het niet werkt omdat je je tabel dynamisch maakt, maar dat zul je maar even moeten testen.

Bedankt Vegras,

Oké.. het probleem is dus (hoogwaarschijnlijk) dat het niet werkt omdat de tabel dynamisch wordt gemaakt. Dit geldt voor jouw link maar volgens mij ook voorde js source die ik geprobeerd heb.

Hoe zou dit op te lossen zijn?

Alvast bedankt.
 
Ik wil best even meekijken, maar dan heb ik wel even wat code nodig. Heb je toevallig een online demo / voorbeeld (desnoods met oude data).

omdat je tabel dynamisch wordt gemaakt is het mischien een idee om de sorteer-code een beetje aan te passen en pas aan te roepen als je tabel al bestaat. De huidige code zoekt namelijk naar tabellen en maakt ze direct sorteerbaar, maar omdat er nog geen <tr>'s zijn, werkt ie dus niet. Mocht dit niet werken kunnen we altijd nog een zelfgemaakte sort-functie maken.


:thumb:
 
Laatst bewerkt:
Ik wil best even meekijken, maar dan heb ik wel even wat code nodig. Heb je toevallig een online demo / voorbeeld (desnoods met oude data).

omdat je tabel dynamisch wordt gemaakt is het mischien een idee om de sorteer-code een beetje aan te passen en pas aan te roepen als je tabel al bestaat. De huidige code zoekt namelijk naar tabellen en maakt ze direct sorteerbaar, maar omdat er nog geen <tr>'s zijn, werkt ie dus niet. Mocht dit niet werken kunnen we altijd nog een zelfgemaakte sort-functie maken.


:thumb:

Vegras, ik heb het volgende online staan;

http://83.232.122.113:502/alarmtable/testtable.html
Hier de table waarin ik graag zou willen sorteren op datum..

In deze tabel(len) ben ik het sorteren aan het proberen..
http://83.232.122.113:502/alarmtable/table.html

Hier zie ik dat de table welke in de html is gezet te sorteren is maar de table welke dynamisch gemaakt wordt niet. Dit waarschijnlijk vanwege het nog ontbreken van de table tijdens het uitvoeren van het script..
http://dl.dropbox.com/u/7660662/sortable.js

Alvast bedankt voor de hulp!
 
Heeeeeeeee, kijk eens aan. In je eerste link heb je een javascript file dat sorting doet, met deze regel:[JS]//addEvent(window, "load", sortables_init);[/JS]maar, deze is gecomment. Wat dit dus doet is pas de sortables_init functie aanroepen als de pagina geladen is. Dit willen we niet, we willen het pas als alle data is geladen.

Als je nou eens dat script in je 2e link pagina stopt, en de sortables_init() functie aanroept aan het eind van de code waarmee je je tabel-cellen creeert? Dus helemaal onderaan je parse() functie aanroepen.


:thumb:


[edit]waar is dit gehele project trouwens voor? Je bent er geloof ik al een tijdje mee bezig[/edit]
 
Laatst bewerkt:
Heeeeeeeee, kijk eens aan. In je eerste link heb je een javascript file dat sorting doet, met deze regel:[JS]//addEvent(window, "load", sortables_init);[/JS]maar, deze is gecomment. Wat dit dus doet is pas de sortables_init functie aanroepen als de pagina geladen is. Dit willen we niet, we willen het pas als alle data is geladen.

Als je nou eens dat script in je 2e link pagina stopt, en de sortables_init() functie aanroept aan het eind van de code waarmee je je tabel-cellen creeert? Dus helemaal onderaan je parse() functie aanroepen.


:thumb:


[edit]waar is dit gehele project trouwens voor? Je bent er geloof ik al een tijdje mee bezig[/edit]


Vegras,
Bedankt zover, Ik dacht ook al zoiets en had een timeout op de sortfunctie gezet maar dat werkte niet. Ik heb je voorstel geprobeerd maar het werkt niet?

http://83.232.122.113:502/alarmtable/table.html

Vreemd genoeg doet het script het overigens momenteel alleen in FF..

Ik ben inderdaad al een hele tijd met het project bezig... het heeft een poos stilgelegen maar heb nu weer wat tijd om er mee verder te gaan. Het project is voor een power quality analyser. Dit is een veredelde kWh meter welke de netspanningskwaliteit monitored. Hartstikke leuk project alleen is het probleem dat ik het tussen de andere projecten door zou doen.. Dit is niet echt gelukt. Dit mede vanwege het feit dat ik geen enkele kennis van html, css en javascript had.. Ik begin er langzaam een beetje grip op te krijgen maar heb meestal nog de grootste moeite om een knappe functie neer te zetten. meestal strand ik in de probeerfase... zodra ik het goed werkend heb probeer ik de functies op te knappen en effiecenter te maken, maar dit met een redelijk beperkt inzicht... Ik heb nog een lange weg te gaan alvorens te kunnen zeggen dat ik het volledig in de hand heb. Ik probeer zoveel mogelijk mbv google en dit forum te vinden en toe te passen maar raak meestal het spoor bijster als er zich een probleem voordoet zoals wanneer het sorteren van een tabel niet werkt. Daarbij dan nog de verschillen tussen de browsers en het feest is compleet... :shocked:

Mocht je gelegenheid hebben dan hoor ik graag van je of je enig idee hebt waar het zou kunnen liggen dat het niet werkt.

Bedankt!
 
Interessant,
Fout: syntaxisfout
Bronbestand: http://83.232.122.113:502/csvdata/week25/freq_events.csv?1277806653366
Regel: 1, Kolom: 1
Broncode:
1.00
Verander je ajax() functie eens hierin?[JS]function ajax(url) {
if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera,
// Safari
req = new XMLHttpRequest();
} else { // code for IE6, IE5
req = new ActiveXObject("Microsoft.XMLHTTP");
}
req.open("GET", url, false);

if(req.overrideMimeType)
{
// it's called Async. Javascript And Xml (AJAX) for a reason. We don't want XML, we want text:
req.overrideMimeType('text/plain');
}

req.send(null);
return req.responseText;
}[/JS]dat zou deze error moeten weghalen.

Ik ga vanmiddag even verder kijken naar je code.
 
Vegras,

Heb je misschien al enige gelegenheid gehad om naar de code te kijken ik snap niet waarom het bij mij niet werkt...??:confused:

Alvast bedankt
 
Hi peba,


was dit weekeind een beetje ziek, en heb niet echt tijd gehad. Ik zal er morgen eventjes naar kijken.
 
Hi peba,


was dit weekeind een beetje ziek, en heb niet echt tijd gehad. Ik zal er morgen eventjes naar kijken.

Hallo Vegras,

Alle beterschap, ik zie het wel als je gelegenheid hegt gehad.:thumb:
 
Hoi,


ik kwam toevallig gisteren deze link tegen, over het sorteren van tabellen in Javascript. Zoals je ziet hoef je alleen maar een ID van een tabel in te geven. Als je een beetje klooit met de code kan je er zelf mischien uitkomen; ik heb (nogsteeds) geen tijd (gehad) maar zal zeker asap zelf ook even wat proberen.


:thumb:


[edit]This guy gaat er nu mee bezig[/edit]
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan