Skip to content

Commit 5565bac

Browse files
add basic csv/tsv data parsing with d3.dsv for now (#9)
1 parent 3b836e3 commit 5565bac

File tree

3 files changed

+49
-4
lines changed

3 files changed

+49
-4
lines changed

package-lock.json

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@
162162
"test": "node ./out/test/runTest.js"
163163
},
164164
"devDependencies": {
165+
"@types/d3-dsv": "^3.0.0",
165166
"@types/vscode": "^1.63.0",
166167
"@types/glob": "^7.2.0",
167168
"@types/mocha": "^9.0.0",

src/views/tableView.ts

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import { TextDecoder } from 'util';
1818
import * as fileUtils from '../utils/fileUtils';
1919
import { ViewTypes } from './viewTypes';
2020

21+
const d3 = require('d3-dsv');
22+
2123
/**
2224
* Defines Table view class for managing state and behaviour of Table webview panels.
2325
*/
@@ -30,6 +32,7 @@ export class TableView {
3032
private readonly _documentUri: Uri;
3133
private readonly _viewUri: Uri;
3234
private readonly _fileName: string;
35+
private readonly _fileExtension: string;
3336
private _disposables: Disposable[] = [];
3437

3538
/**
@@ -109,6 +112,7 @@ export class TableView {
109112

110113
// extract data file name from the data source document path
111114
this._fileName = fileUtils.getFileName(documentUri);
115+
this._fileExtension = path.extname(this._fileName);
112116

113117
// dispose table view resources when table view panel is closed by the user or via vscode apis
114118
this._webviewPanel.onDidDispose(this.dispose, null, this._disposables);
@@ -161,13 +165,19 @@ export class TableView {
161165
// load data
162166
workspace.fs.readFile(this._documentUri).then((binaryData: Uint8Array) => {
163167
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);
165174

166175
// update webview
167176
this.webviewPanel.webview.postMessage({
168177
command: 'refresh',
169178
fileName: this._fileName,
170-
documentUrl: this._documentUri.toString()
179+
documentUrl: this._documentUri.toString(),
180+
tableData: tableData
171181
});
172182
}, reason => {
173183
window.showErrorMessage(`Could not load \`${this._documentUri}\` content. Reason: \n ${reason}`);
@@ -180,12 +190,23 @@ export class TableView {
180190
* @param textData Text data to log.
181191
* @param maxChars Max characters to log.
182192
*/
183-
private logData(textData: string, maxChars: number = 1000): void {
193+
private logTextData(textData: string, maxChars: number = 1000): void {
184194
const contentLength: number = textData.length;
185-
console.log('tabular.data.view:refresh(): data:\n',
195+
console.log('tabular.data.view:data:\n',
186196
textData.substring(0, contentLength > maxChars ? maxChars : contentLength), ' ...');
187197
}
188198

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+
189210
/**
190211
* Gets the underlying webview panel instance for this view.
191212
*/
@@ -215,6 +236,23 @@ export class TableView {
215236
return this._viewUri;
216237
}
217238

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+
218256
/**
219257
* Creates webview html content for the webview panel display.
220258
*

0 commit comments

Comments
 (0)