解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
|
# CsvFile ʹÓÃÊÖ²á
±¾Îĵµ»ùÓÚÔ´Âë `NewLife.Core/IO/CsvFile.cs`£¬ÓÃÓÚ˵Ã÷ `CsvFile`£¨CSV ¶ÁдÆ÷£©µÄÉè¼ÆÄ¿±ê¡¢RFC4180 ¼æÈÝÐÐΪ¡¢Í¬²½/Òì²½ API£¬ÒÔ¼°´óÎļþ³¡¾°ÏµÄʹÓý¨Òé¡£
> ¹Ø¼ü´Ê£ºRFC4180¡¢Á÷ʽ½âÎö¡¢ÒýºÅ×ֶΡ¢CRLF¡¢ÔöÁ¿¶Áд¡¢Encoding¡¢Separator¡£
---
## 1. ¸ÅÊö
`CsvFile` ÊÇÒ»¸öÃæÏò¡°³¬´ó CSV Îļþ¡±µÄÇáÁ¿¹¤¾ßÀ֧࣬³Ö£º
- **ÖðÐУ¨Record£©¶ÁÈ¡**£º°´¼Ç¼½âÎö¶ø²»ÊǼòµ¥ `ReadLine()+Split`£»
- **ÖðÐÐдÈë**£º°´Ðè×·¼ÓдÈ룬±ÜÃâÒ»´ÎÐÔ¹¹½¨Õû¸öÎļþ£»
- **RFC4180 »ù±¾¹æÔò¼æÈÝ**£º
- ×Ö¶ÎʹÓà `Separator` ·Ö¸ô£»
- ×Ö¶ÎÖк¬·Ö¸ô·û/»»ÐÐ/Ë«ÒýºÅʱʹÓÃË«ÒýºÅ°ü¹ü£»
- ×Ö¶ÎÄÚË«ÒýºÅÓà `""` תÒ壻
- ÔÊÐíÒýºÅ×Ö¶ÎÄÚ²¿³öÏÖ»»ÐУ¨¿çÐÐ×ֶΣ©¡£
ÊÊÓó¡¾°£º
- Êý¾Ýµ¼Èëµ¼³ö£»
- ÐèÒª¶Ô³¬´ó CSV ×öÁ÷ʽ¶ÁÈ¡¡¢±ß¶Á±ß´¦Àí£»
- ÐèÒªÕýÈ·´¦Àíº¬¶ººÅ/»»ÐÐ/ÒýºÅµÄ×ֶΡ£
---
## 2. ºËÐÄÊôÐÔ
### 2.1 `Encoding`
- ÀàÐÍ£º`Encoding`
- ĬÈÏ£º`Encoding.UTF8`
Ó°Ï죺
- ¶ÁȡʱÓÃÓÚ¹¹Ôì `StreamReader`£»
- дÈëʱÓÃÓÚ¹¹Ôì `StreamWriter`¡£
˵Ã÷£º
- `EnsureReader()` ʹÓà `new StreamReader(_stream, Encoding)`£¬Ä¬ÈÏÆôÓà BOM ¼ì²â£¨`detectEncodingFromByteOrderMarks=true` ΪĬÈÏÐÐΪ£©¡£
### 2.2 `Separator`
- ÀàÐÍ£º`Char`
- ĬÈÏ£º`,`
˵Ã÷£º
- ¶ÁȡʱÓÃÓÚ×ֶηָô£»
- дÈëʱÓÃÓÚÆ´½Ó×ֶΣ¬²¢¾Ý´ËÅжÏÊÇ·ñÐèÒª¼ÓÒýºÅ¡£
---
## 3. ¹¹ÔìÓë×ÊÔ´¹ÜÀí
### 3.1 ¹¹Ô췽ʽ
- `CsvFile(Stream stream)`
- `CsvFile(Stream stream, Boolean leaveOpen)`
- `CsvFile(String file, Boolean write = false)`
`write=false`£ºÒÔ `FileAccess.Read` ´ò¿ª£¨Ö»¶Á£©¡£
`write=true`£ºÒÔ `FileAccess.ReadWrite` ´ò¿ª£¨¶Áд£¬²»×Ô¶¯½Ø¶Ï£©¡£ÊʺÏÔöÁ¿×·¼Ó»ò¸²¸Çд£¨¸²¸ÇдʱÓɵ÷Ó÷½¿ØÖÆ `Position/SetLength`£©¡£
### 3.2 `leaveOpen`
µ±Ê¹Óà `CsvFile(Stream, leaveOpen:true)`£º
- `Dispose()` ²»»á¹Ø±Õ `_stream`£»
- µ«ÈÔ»á `Flush()`/ÊÍ·ÅÄÚ²¿ `_reader/_writer`¡£
### 3.3 Dispose ÐÐΪ
- `Dispose()` »áÏÈ `_writer?.Flush()`£¬±ÜÃâдÈëÆ÷»º³åδÂäÅÌ£»
- Èô `_leaveOpen=false`£º»áÊÍ·Å `_reader/_writer` ²¢¹Ø±ÕÁ÷¡£
ÔÚ `NET5_0_OR_GREATER || NETSTANDARD2_1_OR_GREATER` Ï»¹Ìṩ `DisposeAsync()`¡£
---
## 4. ¶ÁÈ¡£¨RFC4180 ·ç¸ñ Record ½âÎö£©
### 4.1 `String[]? ReadLine()`
¶ÁȡһÌõ¼Ç¼£¨Record£©£¬·µ»Ø×Ö¶ÎÊý×飺
- EOF ·µ»Ø `null`£»
- Ö§³ÖÒýºÅ×Ö¶ÎÄÚ²¿°üº¬ `Separator`¡¢`\r\n`¡¢`\n`£»
- `""` ½âÎöΪ `"`£»
- Ö§³Öβ²¿¿Õ×ֶΣ¨ÀýÈç `a,b,` => Èý¸ö×ֶΣ¬×îºóÒ»¸öΪ¿Õ×Ö·û´®£©¡£
### 4.2 `IEnumerable<String[]> ReadAll()`
ͬ²½Ã¶¾Ù¶Áȡȫ²¿¼Ç¼£º
- ÄÚ²¿Ñ»·µ÷Óà `ReadLine()` Ö±µ½ EOF¡£
### 4.3 Òì²½¶ÁÈ¡
½öÔÚ `NET5_0_OR_GREATER || NETSTANDARD2_1_OR_GREATER` Ï¿ÉÓãº
- `ValueTask<String[]?> ReadLineAsync()`
- `IAsyncEnumerable<String[]> ReadAllAsync()`
Ò첽ʵÏÖ²ÉÓÃÄÚ²¿×Ö·û»º³åÇø£¨`Char[4096]`£©½âÎö¡£
---
## 5. дÈ루RFC4180 ·ç¸ñתÒ壩
### 5.1 `void WriteLine(IEnumerable<Object?> line)`
дһÐмǼ£¨×Ô¶¯×·¼ÓÐÐβ»»ÐУ©£º
- `DateTime`£ºÊ¹Óà `ToFullString("")`£»
- `Boolean`£ºÐ´ `1/0`£»
- ÆäËüÀàÐÍ£º`item + ""` ת×Ö·û´®£»
- **³¤ÕûÊý×Ö·û´®£¨³¤¶È > 9 ÇҿɽâÎöΪ Int64£©**£ºÇ°Öà `\t`£¬ÓÃÓÚ±ÜÃâ Excel/WPS µÈÏÔʾΪ¿ÆÑ§¼ÆÊý·¨£»
- Èô×ֶΰüº¬£º·Ö¸ô·û/CR/LF/Ë«ÒýºÅ£¬ÔòÕûÌå¼ÓË«ÒýºÅ£¬²¢½«ÄÚ²¿Ë«ÒýºÅÌæ»»Îª `""`¡£
### 5.2 `void WriteAll(IEnumerable<IEnumerable<Object?>> data)`
ÖðÐÐдÈ룺
- ÄÚ²¿Ñ»·µ÷Óà `WriteLine(line)`¡£
### 5.3 `Task WriteLineAsync(IEnumerable<Object> line)`
Ò첽дһÐУ¨½öдÈëÆ÷Òì²½£©¡£
×¢Ò⣺
- ¸Ã·½·¨²ÎÊýΪ `IEnumerable<Object>`£¬²»½ÓÊÜ `null` ÏÓëͬ²½ `Object?` ²»Í¬£©¡£
---
## 6. ×îСʾÀý
### 6.1 ¶ÁÈ¡ CSV
```csharp
using NewLife.IO;
using var csv = new CsvFile("./data.csv");
while (true)
{
var row = csv.ReadLine();
if (row == null) break;
// row ÊÇ×Ö¶ÎÊý×é
// ÀýÈ磺row[0], row[1] ...
}
```
### 6.2 дÈë CSV£¨¸²¸Çд£©
```csharp
using NewLife.IO;
using var csv = new CsvFile("./out.csv", write: true);
// Ö±½ÓдÈë
csv.WriteLine("Id", "Name", "Remark");
csv.WriteLine(1, "Stone", "hello,world");
```
### 6.3 ×·¼Óд£¨ÔöÁ¿£©
```csharp
using NewLife.IO;
using var csv = new CsvFile("./out.csv", write: true);
// ¹¹Ô캯Êý write:true ÒÔ ReadWrite ´ò¿ªÇÒ²»½Ø¶Ï
// ÈôҪ׷¼Óµ½Î²²¿£¬¿É×ÔÐж¨Î»
// £¨Ò²¿ÉÓà FileStream + CsvFile(stream, true) ¸üÁé»î£©
csv.WriteLine(DateTime.Now, true, "append");
```
---
## 7. ×¢ÒâÊÂÏîÓë³£¼ûÎÊÌâ
### 7.1 ¶ÁÈ¡²»Êǰ´¡°ÎïÀíÐС±¶øÊǰ´¡°¼Ç¼¡±
µ±×ֶα»Ë«ÒýºÅ°ü¹üÇÒÄÚ²¿º¬»»ÐÐʱ£¬`ReadLine()` »á¿çÔ½¶àÐжÁµ½ÒýºÅ±ÕºÏΪֹ£¬ÕâÊÇ CSV ÓïÒåÕýÈ·µÄÐÐΪ¡£
### 7.2 `Separator` ¸ÄÎªÖÆ±í·û£¨TSV£©
```csharp
var csv = new CsvFile(file) { Separator = '\t' };
```
дÈëʱ»á¾Ý´ËÅжÏÊÇ·ñÐèÒªÒýºÅ¡£
### 7.3 ±àÂëÑ¡Ôñ
- Excel ÔÚijЩ»·¾³ÏÂ¶Ô UTF-8 ÎÞ BOM ʶ±ð²»¼Ñ£»ÈôÐèÒª¼æÈÝ£¬¿É¿¼ÂÇдÈëǰ×ÔÐÐÊä³ö BOM »ò¸ÄÓà `Encoding.UTF8` ´ø BOM µÄ°æ±¾£¨Óɵ÷Ó÷½¿ØÖÆÁ÷дÈ룩¡£
---
## 8. Ïà¹ØÁ´½Ó
- ÔÚÏßÎĵµ£º`https://newlifex.com/core/csv_file`
- Ô´Â룺`NewLife.Core/IO/CsvFile.cs`
|