如何将 sqlite 数据库 表 的 数据 导出 成txt文件?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将 sqlite 数据库 表 的 数据 导出 成txt文件?相关的知识,希望对你有一定的参考价值。
请问怎么将sqlite数据库表中的数据导出成txt文件?用逗号做列分隔符,换行做行分隔符,谢谢!!!
数据导入的来源可以是其他应用程序的输出,也可以是指定的文本文件,这里采用指定的文本文件。1. 首先,确定导入的数据源,这里是待导入的,按固定格式的文本文件。
2. 然后,依照导入的文件格式,确定想导入的目标数据表,这个数据表如果没有,可以依照待导入的文本文件格式,创建一个相对应的数据表。
3. 最后,执行.import命令,将文本文件中数据导入数据表中。
1. 数据源
在/home/ywx/yu/sqlite/下,创建一个名为data.txt的文本文件,并输入以下数据,数据之间采用逗号隔开
id,name,age,address,hobby
1,tom,24,beijing,football
2,liu,27,heibei,fotball
3,jim,26,shandong,football
4,han,28,beijing,football
5,meng,25,beijing,tennis
2. 目标数据表
这里创建一张目标数据表,通过分析文本格式,这里需要3个字段,分别是id,name,age。但在数据类型选择时存在一个问题,id和age在文本文件
中是按字符型存储的,而其实际在数据表中,最好要表示成整型,因此这里要涉及到一个字符型数据类型向整型数据类型转换的问题。
在创建表时,将id和age的类型定义为整型,进行强制转换,如果在数据导入时,发现转换失败,可以将id和age类型改为文本型。
ywx@ywx:~/yu/sqlite$ sqlite3 test.db
SQLite version 3.7.7.1 2011-06-28 17:39:05
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table data_txt_table(id char(10),name char(10),age char(10),address varchar(15),hobby varchar (15));
sqlite>
3. 导入命令
sqlite> .separator ","
sqlite> .import data.txt data_txt_table
sqlite> select * from data_txt_table;
id,name,age,address,hobby
1,tom,24,beijing,football
2,liu,27,heibei,fotball
3,jim,26,shandong,football
4,han,28,beijing,football
5,meng,25,beijing,tennis
sqlite>
这里需要注意一点,在数据导入之前,先要根据数据的具体分的格式,设置数据导入的间隔符,例如在文本数据中采用的是‘,’来间隔数据,因此应先调用.seperator 设置‘,’ 为间隔符。
2. 查看命令
.schema 命令来查看指定的数据表的结构
sqlite> .schema data_txt_table
CREATE TABLE data_txt_table(id char(10),name char(10),age char(10),address varchar(15),hobby varchar (15));
sqlite>
2. .tables 命令用来查看当前数据库的所有数据表
sqlite> .tables
data_txt_table
sqlite>
3. databases 命令用来查看当前所有数据库
sqlite> .databases
seq name file
--- --------------- ----------------------------------------------------------
0 main /home/ywx/yu/sqlite/test.db
1 temp
3. 数据导出
数据导出也是一个常用到的操作,可以将指定表中的数据导出成SQL脚本,供其他数据库使用,还可以将指定的数据表中的数据完整定位到标准输出,也可以将指定数据库中的数据完整的导入到另一个指定数据库等,
1. 导出成指定的SQL脚本
将sqlite中指定的数据表以SQL创建脚本的形式导出,具体命令
ywx@ywx:~/yu/sqlite$ sqlite3 test.db
SQLite version 3.7.7.1 2011-06-28 17:39:05
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .output data.sql
sqlite> .dump
sqlite>
ywx@ywx:~/yu/sqlite$ ll
总计 16
drwxr-xr-x 2 ywx ywx 4096 2011-08-13 23:15 ./
drwxr-xr-x 7 ywx ywx 4096 2011-08-13 20:53 ../
-rw-r--r-- 1 ywx ywx 602 2011-08-13 23:17 data.sql
-rw-r--r-- 1 ywx ywx 2048 2011-08-13 22:44 test.db
2. 数据库导出
data.sql test.db
ywx@ywx:~/yu/sqlite$ sqlite3 test.db ".dump" | sqlite3 test2.db
ywx@ywx:~/yu/sqlite$ ll
总计 20
drwxr-xr-x 2 ywx ywx 4096 2011-08-13 23:20 ./
drwxr-xr-x 7 ywx ywx 4096 2011-08-13 20:53 ../
-rw-r--r-- 1 ywx ywx 602 2011-08-13 23:17 data.sql
-rw-r--r-- 1 ywx ywx 2048 2011-08-13 23:20 test2.db
-rw-r--r-- 1 ywx ywx 2048 2011-08-13 22:44 test.db
3. 其他格式,如:htm格式输出
ywx@ywx:~/yu/sqlite$ sqlite3 -html test.db "select * from data_txt_table" > liu.htm
ywx@ywx:~/yu/sqlite$ ls
data.sql liu.htm test2.db test.db 参考技术A .mode csv
.out "output.csv"
select * from the_table本回答被提问者采纳
以编程方式将 SQLite 数据导出到 iOS 中的 Excel
【中文标题】以编程方式将 SQLite 数据导出到 iOS 中的 Excel【英文标题】:Export SQLite data to Excel in iOS programmatically 【发布时间】:2012-06-23 09:03:18 【问题描述】:在我的应用程序中,我使用 sqlite 作为后端(在本地存储数据)。 我能够将数据插入到我的表中。但我想要做的是,想以编程方式将我所有的 sqlite 数据导入到 excel 中。我不想为这个应用程序使用服务器。一旦生成了 excel 表,用户应该能够邮寄那张纸。 这在 iPhone 中是否可行: 请帮帮我。
以下是我将数据插入表格的代码:
-(IBAction)Login
sqlite3_stmt *stmt;
char *errorMsg;
char *update1 = "insert into Login1 values (?,?,?,?);";
int x = sqlite3_prepare_v2(database, update1, -1, &stmt, nil);
if (x == SQLITE_OK)
sqlite3_bind_text(stmt, 1, NULL,-1, NULL);
sqlite3_bind_text(stmt, 2, [USERID UTF8String],-1, NULL);
sqlite3_bind_text(stmt, 3, [str1 UTF8String],-1, NULL);
sqlite3_bind_text(stmt, 4, [str4 UTF8String],-1, NULL);
if (sqlite3_step(stmt) != SQLITE_DONE)
NSLog(@"Error: %@",errorMsg);
sqlite3_finalize(stmt);
【问题讨论】:
【参考方案1】:对于我这样做的应用程序,SQLite 数据相当大。因此,我使用后台线程将所有数据导出到 Excel 可以导入的 CSV(逗号分隔值)文件,然后以 CSV 文件作为附件打开邮件编写器。如果您的数据很小,您可能不需要使用后台线程:
- (IBAction) export: (id) sender
// in my full code, I start a UIActivityIndicator spinning and show a
// message that the app is "Exporting ..."
[self performSelectorInBackground: @selector(exportImpl) withObject: nil];
这里是exportImpl
- (void) exportImpl
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
NSArray* documentPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSSystemDomainMask, YES);
NSString* documentsDir = [documentPaths objectAtIndex:0];
NSString* csvPath = [documentsDir stringByAppendingPathComponent: @"export.csv"];
// TODO: mutex lock?
[sqliteDb exportCsv: csvPath];
[pool release];
// mail is graphical and must be run on UI thread
[self performSelectorOnMainThread: @selector(mail:) withObject: csvPath waitUntilDone: NO];
- (void) mail: (NSString*) filePath
// here I stop animating the UIActivityIndicator
// http://howtomakeiphoneapps.com/home/2009/7/14/how-to-make-your-iphone-app-send-email-with-attachments.html
BOOL success = NO;
if ([MFMailComposeViewController canSendMail])
// TODO: autorelease pool needed ?
NSData* database = [NSData dataWithContentsOfFile: filePath];
if (database != nil)
MFMailComposeViewController* picker = [[MFMailComposeViewController alloc] init];
picker.mailComposeDelegate = self;
[picker setSubject:[NSString stringWithFormat: @"%@ %@", [[UIDevice currentDevice] model], [filePath lastPathComponent]]];
NSString* filename = [filePath lastPathComponent];
[picker addAttachmentData: database mimeType:@"application/octet-stream" fileName: filename];
NSString* emailBody = @"Attached is the SQLite data from my iOS device.";
[picker setMessageBody:emailBody isHTML:YES];
[self presentModalViewController:picker animated:YES];
success = YES;
[picker release];
if (!success)
UIAlertView* warning = [[UIAlertView alloc] initWithTitle: @"Error"
message: @"Unable to send attachment!"
delegate: self
cancelButtonTitle: @"Ok"
otherButtonTitles: nil];
[warning show];
[warning release];
然后,我有一个封装我所有 SQLite 数据的类。这个类是唯一一个进行 sqlite 调用的类。在这个类中,我有一种方法可以将数据导出到我的应用程序 caches 目录中的 CSV 文件中。上面代码中的变量sqliteDb
就是这个类的一个实例。导出数据的方法如下:
-(void) exportCsv: (NSString*) filename
// We record this filename, because the app deletes it on exit
self.tempFile = filename;
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
// Setup the database object
sqlite3* database;
// Open the database from the users filessytem
if (sqlite3_open([self.databasePath UTF8String], &database) == SQLITE_OK)
[self createTempFile: filename];
NSOutputStream* output = [[NSOutputStream alloc] initToFileAtPath: filename append: YES];
[output open];
if (![output hasSpaceAvailable])
NSLog(@"No space available in %@", filename);
// TODO: UIAlertView?
else
NSString* header = @"Source,Time,Latitude,Longitude,Accuracy\n";
NSInteger result = [output write: [header UTF8String] maxLength: [header length]];
if (result <= 0)
NSLog(@"exportCsv encountered error=%d from header write", result);
BOOL errorLogged = NO;
NSString* sqlStatement = @"select timestamp,latitude,longitude,horizontalAccuracy from my_sqlite_table";
// Setup the SQL Statement and compile it for faster access
sqlite3_stmt* compiledStatement;
if (sqlite3_prepare_v2(database, [sqlStatement UTF8String], -1, &compiledStatement, NULL) == SQLITE_OK)
// Loop through the results and write them to the CSV file
while (sqlite3_step(compiledStatement) == SQLITE_ROW)
// Read the data from the result row
NSInteger secondsSinceReferenceDate = (NSInteger)sqlite3_column_double(compiledStatement, 0);
float lat = (float)sqlite3_column_double(compiledStatement, 1);
float lon = (float)sqlite3_column_double(compiledStatement, 2);
float accuracy = (float)sqlite3_column_double(compiledStatement, 3);
if (lat != 0 && lon != 0)
NSDate* timestamp = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate: secondsSinceReferenceDate];
NSString* line = [[NSString alloc] initWithFormat: @"%@,%@,%f,%f,%d\n",
table, [dateFormatter stringFromDate: timestamp], lat, lon, (NSInteger)accuracy];
result = [output write: [line UTF8String] maxLength: [line length]];
if (!errorLogged && (result <= 0))
NSLog(@"exportCsv write returned %d", result);
errorLogged = YES;
[line release];
[timestamp release];
// Release the compiled statement from memory
sqlite3_finalize(compiledStatement);
[output close];
[output release];
sqlite3_close(database);
[pool release];
-(void) createTempFile: (NSString*) filename
NSFileManager* fileSystem = [NSFileManager defaultManager];
[fileSystem removeItemAtPath: filename error: nil];
NSMutableDictionary* attributes = [[NSMutableDictionary alloc] init];
NSNumber* permission = [NSNumber numberWithLong: 0640];
[attributes setObject: permission forKey: NSFilePosixPermissions];
if (![fileSystem createFileAtPath: filename contents: nil attributes: attributes])
NSLog(@"Unable to create temp file for exporting CSV.");
// TODO: UIAlertView?
[attributes release];
我的代码正在导出位置信息数据库。显然,在 exportCsv
中,您需要将我的 sqlite 调用替换为适合您的数据库内容的调用。
此外,代码将数据存储在临时文件中。您可能需要决定何时清除这些临时文件。
显然,此代码是在 ARC 可用之前编写的。根据需要进行调整。
【讨论】:
以上是关于如何将 sqlite 数据库 表 的 数据 导出 成txt文件?的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式将 SQLite 数据导出到 iOS 中的 Excel
如何使用 sqlite3.exe 从导出的 .sql 脚本创建数据库
sqlite3: 用脚本批量导出sqlite数据库中的表格数据