質問編集履歴

1

ソースの修正・追加

2016/01/27 00:39

投稿

k47
k47

スコア12

test CHANGED
File without changes
test CHANGED
@@ -76,7 +76,7 @@
76
76
 
77
77
  Public Function Import_M_MODEL() As Boolean
78
78
 
79
- Dim ret As String = True
79
+ Dim ret As Boolean = True
80
80
 
81
81
  Dim row As model
82
82
 
@@ -189,3 +189,209 @@
189
189
  End Function
190
190
 
191
191
  ```
192
+
193
+
194
+
195
+ 以下はCsvToListのソースです。
196
+
197
+
198
+
199
+ ```ここに言語を入力
200
+
201
+ ''' <summary>
202
+
203
+ ''' CSVをListに変換
204
+
205
+ ''' </summary>
206
+
207
+ ''' <param name="csvText">CSVの内容が入ったString</param>
208
+
209
+ ''' <returns>変換結果のList</returns>
210
+
211
+ Public Function CsvToList(ByVal csvText As String) As List(Of String())
212
+
213
+ '前後の改行を削除しておく
214
+
215
+ csvText = csvText.Trim(New Char() {ControlChars.Cr, ControlChars.Lf})
216
+
217
+
218
+
219
+ Dim csvRecords As New List(Of String())
220
+
221
+ Dim csvFields As New List(Of String)
222
+
223
+
224
+
225
+ Dim csvTextLength As Integer = csvText.Length
226
+
227
+ Dim startPos As Integer = 0
228
+
229
+ Dim endPos As Integer = 0
230
+
231
+ Dim field As String = ""
232
+
233
+
234
+
235
+ While True
236
+
237
+ '空白を飛ばす
238
+
239
+ While startPos < csvTextLength _
240
+
241
+ AndAlso (csvText.Chars(startPos) = " "c _
242
+
243
+ OrElse csvText.Chars(startPos) = ControlChars.Tab)
244
+
245
+ startPos += 1
246
+
247
+ End While
248
+
249
+
250
+
251
+ 'データの最後の位置を取得
252
+
253
+ If startPos < csvTextLength AndAlso csvText.Chars(startPos) = ControlChars.Quote Then
254
+
255
+ '"で囲まれているとき
256
+
257
+ '最後の"を探す
258
+
259
+ endPos = startPos
260
+
261
+ While True
262
+
263
+ endPos = csvText.IndexOf(ControlChars.Quote, endPos + 1)
264
+
265
+ If endPos < 0 Then
266
+
267
+ Throw New ApplicationException("""が不正")
268
+
269
+ End If
270
+
271
+ '"が2つ続かない時は終了
272
+
273
+ If endPos + 1 = csvTextLength OrElse _
274
+
275
+ csvText.Chars((endPos + 1)) <> ControlChars.Quote Then
276
+
277
+ Exit While
278
+
279
+ End If
280
+
281
+ '"が2つ続く
282
+
283
+ endPos += 1
284
+
285
+ End While
286
+
287
+
288
+
289
+ '一つのフィールドを取り出す
290
+
291
+ field = csvText.Substring(startPos, endPos - startPos + 1)
292
+
293
+ '""を"にする
294
+
295
+ field = field.Substring(1, field.Length - 2). _
296
+
297
+ Replace("""""", """")
298
+
299
+
300
+
301
+ endPos += 1
302
+
303
+ '空白を飛ばす
304
+
305
+ While endPos < csvTextLength AndAlso _
306
+
307
+ csvText.Chars(endPos) <> ","c AndAlso _
308
+
309
+ csvText.Chars(endPos) <> ControlChars.Lf
310
+
311
+ endPos += 1
312
+
313
+ End While
314
+
315
+ Else
316
+
317
+ '"で囲まれていない
318
+
319
+ 'カンマか改行の位置
320
+
321
+ endPos = startPos
322
+
323
+ While endPos < csvTextLength AndAlso _
324
+
325
+ csvText.Chars(endPos) <> ","c AndAlso _
326
+
327
+ csvText.Chars(endPos) <> ControlChars.Lf
328
+
329
+ endPos += 1
330
+
331
+ End While
332
+
333
+
334
+
335
+ '一つのフィールドを取り出す
336
+
337
+ field = csvText.Substring(startPos, endPos - startPos)
338
+
339
+ '後の空白を削除
340
+
341
+ field = field.TrimEnd()
342
+
343
+ End If
344
+
345
+
346
+
347
+ 'フィールドの追加
348
+
349
+ csvFields.Add(field)
350
+
351
+
352
+
353
+ '行の終了か調べる
354
+
355
+ If endPos >= csvTextLength OrElse csvText.Chars(endPos) = ControlChars.Lf Then
356
+
357
+ '行の終了
358
+
359
+ 'レコードの追加
360
+
361
+ 'csvFields.TrimExcess()
362
+
363
+ csvRecords.Add(csvFields.ToArray)
364
+
365
+ csvFields.Clear()
366
+
367
+
368
+
369
+ If endPos >= csvTextLength Then
370
+
371
+ '終了
372
+
373
+ Exit While
374
+
375
+ End If
376
+
377
+ End If
378
+
379
+
380
+
381
+ '次のデータの開始位置
382
+
383
+ startPos = endPos + 1
384
+
385
+ End While
386
+
387
+
388
+
389
+ 'csvRecords.TrimExcess()
390
+
391
+ Return csvRecords
392
+
393
+ End Function
394
+
395
+
396
+
397
+ ```