2013-04-16 4 views
0

나는 차트를 제공하는 것보다 csv 파일을 구문 분석하는이 코드를 가지고 있는데, 내 문제는 동일한 단어를 찾기 위해 비교하기 시작한 것보다 알파벳 순서로 CSV 파일의 줄을 정렬하고 싶습니다. 유사성을 찾지 못하는 즉시 다음 단어 확인을 중지하여 9000 * 9000 행을 검사 할 필요가 없습니다.자바 스크립트에서 정렬 줄

<html> 
<head> 
    <title>Chart</title> 
    <script type="text/javascript" src="jquery.min.js"></script> 
    <script type="text/javascript" src="highcharts.js"></script> 
    <link rel="stylesheet" href="style.css" /> 
</head> 

<body> 

<script> 
$(document).ready(function() { 
$.ajax({ 
    type: "GET", 
    url: "uk-4_2_2013.complet.csv", 
    dataType: "text", 
    success: function(data) {processData(data);} 
}); 
}); 

function processData(allText) { 
// varriable qui contient toutes les lignes du fichier CSV 
var allTextLines = allText.split(/\r\n|\n/); 

// liste des lignes 
var lignes=new Array(); 
var nombres=new Array(); 

// liste d'occurance qui correspond a chaque ligne 
var nombre =[]; 
var x=0; 
var y=0; 
var inter1; 
var inter2; 
var i=0; 
var j=0;  
//on parcours les lignes 

for (i=0; i<allTextLines.length; i++) 
    { 
    inetr1 = allTextLines[i].split(';'); 

     if(lignes.indexOf(inetr1[0])<0) 
     { 
      lignes[x]=inetr1[0]; 
      nombres[x]=0; 
       for (j=0; j<allTextLines.length; j++)  
       { 
        inetr2 = allTextLines[j].split(';'); 
        if (inetr1[0]==inetr2[0]) 
        { 
         nombres[x]=nombres[x]+1; 
        }  
       }     
     x=x+1;            
     } 
    } 

$('#Chart_App').highcharts({ 
    chart: { 
     type: 'bar' 
    }, 
    xAxis: { 
     categories: lignes 
    }, 
    yAxis: { 
     title: { 
      text: 'Apps Downloaded' 
     } 
    }, 
    series: [{ 

     data: nombres 
    }] 
}); 
} 
</script> 

<div id="Chart_App"> 
</div> 

</body> 
</html> 

이 같은 CSV 모양

house 
home 
world 
house 
home 

감사

당신은 이미 당신의 가치와 배열이
+6

과 당신은 어떤 데이터베이스에 _outsource_해야 ... 나중에 그들에 대한 검색을 수행) – Ejaz

+2

을^당신은에 같은 Ajax를 사용하여 쿼리 ..that 서버 측. 더 빨라지고 메모리를 덜 사용하며 더 나은 UX를 제공 할 것입니다. – h2ooooooo

+0

코드를 게시 한 작품, 문제는 유사성을 검사하는 루프 때문에 csv 파일을 검사 할 때 40 초 동안 브라우저가 충돌하지만 우선 많은 시간을 절약 할 수 있도록 정렬합니다. – zazoo24

답변

0

할 수 있습니다 단지 종류를 같은 :. 이제

var allTextLines = allText.split(/\r\n|\n/); 
for(var i = allTextLines.length;--i;){ 
    allTextLines[i] = allTextLines[i].split(';'); 
} 
//... 
// now depending on your keys, sort your Array according to the 
// index x where the relevant words are 
allTextLines.sort(function(a,b){return (a[x] > b[x]);}) 

당신은 귀하의 배열 allTextLines을 정렬하고 나머지 것들을 할 수 있습니다.

+0

어쩌면 내가 놓친 것 같아 !! 방금 코드를 복사했습니다. – zazoo24

+0

@ zazoo24'[x]'를 올바른 색인으로 대체 했습니까? – Christoph

+0

'a'와'b'는 이미 배열 값입니다. 액세스 할 수있는 배열'allTextLines'에서 빌드 된 두 개의 배열은 없습니다. 또한 배열을 반복하면서'var inetr1'을 설정하면 무엇을 얻게 될까요 ?? – Simon

0

의견에서 알 수 있듯이 이러한 많은 양의 데이터로이 작업을 수행하려면 데이터베이스를 사용해야합니다.

어쨌든 Javascript에서는 CSV 값이있는 배열이 있으면 sort 메서드를 사용하여 사전 순으로 정렬 할 수 있습니다.

allTextLines.sort(); 

이렇게하면 원래 배열이 변경됩니다.

편집 : 카운팅 회 발생 ...

는 당신이 각 단어의 많은 발생이 CSV에서 개최하는 방법을 확인하려면 이해합니다. 한 줄에 한 단어 씩 CSV가 있으므로 allTextLines는 요소 당 단어가있는 배열입니다. sort() 메서드 다음에 알파벳 순으로 정렬됩니다. 이 아이디어입니다 ~ 자바 스크립트에 9000 선 정렬

allTextLines.sort(); 

var lignes = new Array(); // diferent word values 
var nombres = new Array(); // their occurrences 
var word = allTextLines[0]; // temp word value 
var count = 0; // different words counter 
var occurrence = 1; // occurrence of the temp word 
for (i=1; i<allTextLines.length; i++) { 
    if (allTextLines[i] != word){ 
    lignes[count] = word; 
    nombres[count] = occurrence; 
    count++; 
    word = allTextLines[i]; 
    occurrence = 0; 
    } else { 
    occurrence++; 
    } 
} 
+0

내가 어떻게 코드를 수정하고 게시 할 수 있는지 모르겠다. 내가 엉뚱한 것처럼 – zazoo24

+0

[w3schools 사용을 자제 해주세요] (http://w3fools.com/). – h2ooooooo

+0

w3schools 문제에 대해 전혀 알지 못했습니다. 어쨌든, 나는 그것을 결코 좋아하지 않았다. – Alex

관련 문제