Skip to content

Commit f542fb1

Browse files
committed
Support .psv parsing in CsvViewer
1 parent 0661c23 commit f542fb1

File tree

2 files changed

+45
-24
lines changed

2 files changed

+45
-24
lines changed

QuickLook.Plugin/QuickLook.Plugin.CsvViewer/CsvViewerPanel.xaml.cs

Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -48,35 +48,51 @@ public void LoadFile(string path)
4848
var encoding = CharsetDetector.DetectFromFile(path).Detected?.Encoding ??
4949
Encoding.Default;
5050

51-
using (var sr = new StreamReader(new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), encoding))
51+
using var sr = new StreamReader(new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), encoding);
52+
53+
// Use fixed delimiters for known extensions to avoid mis-detection on small samples.
54+
var extension = Path.GetExtension(path);
55+
var delimiter = extension.Equals(".tsv", StringComparison.OrdinalIgnoreCase)
56+
? "\t"
57+
: extension.Equals(".psv", StringComparison.OrdinalIgnoreCase)
58+
? "|"
59+
: null;
60+
61+
var conf = new CsvConfiguration(CultureInfo.CurrentUICulture)
5262
{
53-
var conf = new CsvConfiguration(CultureInfo.CurrentUICulture) { MissingFieldFound = null, BadDataFound = null, DetectDelimiter = true };
63+
MissingFieldFound = null,
64+
BadDataFound = null,
65+
DetectDelimiter = delimiter == null,
66+
};
5467

55-
using (var parser = new CsvParser(sr, conf))
56-
{
57-
var i = 0;
58-
while (parser.Read())
59-
{
60-
var row = parser.Record;
61-
if (row == null)
62-
break;
63-
row = Concat([$"{i++ + 1}".PadLeft(6)], row);
68+
if (delimiter != null)
69+
{
70+
// Force delimiter for TSV/PSV so CsvHelper doesn't auto-detect incorrectly.
71+
conf.Delimiter = delimiter;
72+
}
6473

65-
if (!binded)
66-
{
67-
SetupColumnBinding(row.Length);
68-
binded = true;
69-
}
74+
using var parser = new CsvParser(sr, conf);
75+
var i = 0;
76+
while (parser.Read())
77+
{
78+
var row = parser.Record;
79+
if (row == null)
80+
break;
81+
row = Concat([$"{i++ + 1}".PadLeft(6)], row);
7082

71-
if (i > limit)
72-
{
73-
Rows.Add(Enumerable.Repeat("...", row.Length).ToArray());
74-
break;
75-
}
83+
if (!binded)
84+
{
85+
SetupColumnBinding(row.Length);
86+
binded = true;
87+
}
7688

77-
Rows.Add(row);
78-
}
89+
if (i > limit)
90+
{
91+
Rows.Add([.. Enumerable.Repeat("...", row.Length)]);
92+
break;
7993
}
94+
95+
Rows.Add(row);
8096
}
8197
}
8298

QuickLook.Plugin/QuickLook.Plugin.CsvViewer/Plugin.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,12 @@ public void Init()
3434

3535
public bool CanHandle(string path)
3636
{
37-
return !Directory.Exists(path) && (path.ToLower().EndsWith(".csv") || path.ToLower().EndsWith(".tsv"));
37+
if (Directory.Exists(path))
38+
return false;
39+
40+
return path.EndsWith(".csv", StringComparison.OrdinalIgnoreCase)
41+
|| path.EndsWith(".tsv", StringComparison.OrdinalIgnoreCase)
42+
|| path.EndsWith(".psv", StringComparison.OrdinalIgnoreCase);
3843
}
3944

4045
public void Prepare(string path, ContextObject context)

0 commit comments

Comments
 (0)