@@ -18,6 +18,8 @@ import { TextDecoder } from 'util';
18
18
import * as fileUtils from '../utils/fileUtils' ;
19
19
import { ViewTypes } from './viewTypes' ;
20
20
21
+ const d3 = require ( 'd3-dsv' ) ;
22
+
21
23
/**
22
24
* Defines Table view class for managing state and behaviour of Table webview panels.
23
25
*/
@@ -30,6 +32,7 @@ export class TableView {
30
32
private readonly _documentUri : Uri ;
31
33
private readonly _viewUri : Uri ;
32
34
private readonly _fileName : string ;
35
+ private readonly _fileExtension : string ;
33
36
private _disposables : Disposable [ ] = [ ] ;
34
37
35
38
/**
@@ -109,6 +112,7 @@ export class TableView {
109
112
110
113
// extract data file name from the data source document path
111
114
this . _fileName = fileUtils . getFileName ( documentUri ) ;
115
+ this . _fileExtension = path . extname ( this . _fileName ) ;
112
116
113
117
// dispose table view resources when table view panel is closed by the user or via vscode apis
114
118
this . _webviewPanel . onDidDispose ( this . dispose , null , this . _disposables ) ;
@@ -161,13 +165,19 @@ export class TableView {
161
165
// load data
162
166
workspace . fs . readFile ( this . _documentUri ) . then ( ( binaryData : Uint8Array ) => {
163
167
const textData : string = new TextDecoder ( ) . decode ( binaryData ) ;
164
- this . logData ( textData ) ;
168
+ this . logTextData ( textData ) ;
169
+
170
+ // parse dsv data for now
171
+ const dsvParser = d3 . dsvFormat ( this . delimiter ) ;
172
+ let tableData : any = dsvParser . parse ( textData , d3 . autoType ) ;
173
+ this . logTableData ( tableData ) ;
165
174
166
175
// update webview
167
176
this . webviewPanel . webview . postMessage ( {
168
177
command : 'refresh' ,
169
178
fileName : this . _fileName ,
170
- documentUrl : this . _documentUri . toString ( )
179
+ documentUrl : this . _documentUri . toString ( ) ,
180
+ tableData : tableData
171
181
} ) ;
172
182
} , reason => {
173
183
window . showErrorMessage ( `Could not load \`${ this . _documentUri } \` content. Reason: \n ${ reason } ` ) ;
@@ -180,12 +190,23 @@ export class TableView {
180
190
* @param textData Text data to log.
181
191
* @param maxChars Max characters to log.
182
192
*/
183
- private logData ( textData : string , maxChars : number = 1000 ) : void {
193
+ private logTextData ( textData : string , maxChars : number = 1000 ) : void {
184
194
const contentLength : number = textData . length ;
185
- console . log ( 'tabular.data.view:refresh(): data:\n' ,
195
+ console . log ( 'tabular.data.view:data:\n' ,
186
196
textData . substring ( 0 , contentLength > maxChars ? maxChars : contentLength ) , ' ...' ) ;
187
197
}
188
198
199
+ /**
200
+ * Logs parsed table data for debug.
201
+ *
202
+ * @param tableData Parsed table data.
203
+ */
204
+ private logTableData ( tableData : any ) : void {
205
+ console . log ( 'tabular.data.view:rowCount:' , tableData . length ) ;
206
+ console . log ( 'columns:' , tableData . columns ) ;
207
+ console . log ( '1st 10 rows:' , tableData . slice ( 0 , 10 ) ) ;
208
+ }
209
+
189
210
/**
190
211
* Gets the underlying webview panel instance for this view.
191
212
*/
@@ -215,6 +236,23 @@ export class TableView {
215
236
return this . _viewUri ;
216
237
}
217
238
239
+ /**
240
+ * Gets data file deleimiter based on file extension.
241
+ */
242
+ get delimiter ( ) : string {
243
+ let delimiter : string = '' ;
244
+ switch ( this . _fileExtension ) {
245
+ case '.csv' :
246
+ delimiter = ',' ;
247
+ break ;
248
+ case '.tsv' :
249
+ case '.tab' :
250
+ delimiter = '\t' ;
251
+ break ;
252
+ }
253
+ return delimiter ;
254
+ }
255
+
218
256
/**
219
257
* Creates webview html content for the webview panel display.
220
258
*
0 commit comments